본문 바로가기

전체 글

MSA 하는데까지 만들어보기 - (1) 1. MSA 란? MicroService Architecture 로 하나의 거대한 Monolithic 한 앱을 작은 단위의 서비스로 쪼개서 개발하는 것이다. 기존의 서비스들은 대부분 Monolithic하게 개발되어 있고 작은 규모에서는 Monolithic 한 구조가 오히려 더 나을수도 있습니다. (서비스 구성이 간단하기 떄문이죠.) 하지만 서비스가 커지게 되면 Monolithic 한 아키텍처로는 다음과 같은 문제점이 발생합니다. 1) 빌드, 배포, 테스트 시간이 기하급수적으로 증가합니다. (당연히 코드가 커질테니) 2) 서비스를 부분적으로 Scale-up 하기 힘듭니다. (예를 들어 내 사이트의 A ,B ,C 기능 중 C를 사용하는 사용자가 많으면 C만 증가하기 싶어도 그렇게 할수 없다. 즉, Mutli.. 더보기
Nginx 서버 1. Nginx가 하는 일 1-1. 웹서버(HTTP Server) 우리 보통 아는 웹서버처럼 클라이언트(앱, 브라우저 등등)으로부터 요청이 들어올때 요청에 맞는 정적파일(html, css, javascript) 을 리턴해주는 역할을 합니다. 1-2. reverse proxy (소프트웨어 로드 밸런서) Nginx가 가짜 웹서버로 동작하며 클라이언트로부터 Nginx 로 요청이 들어오면 Nginx 가 직접 응답하는게 아니라 이 요청을 등록된 다른 서버로 전달하는 역할을 한다. Nginx 설정파일인 /etc/nginx/nginx.conf 파일에는 server라는 블록이 있다.(프록시 서버) 프록시 서버에 포트를 할당하고 location 블록을 이용하여 url 에 대한 리다이렉션 설정을 해주면 된다. 특히 Vue.. 더보기
Stable sort , unstable Sort 1. 정렬의 Stability(안정성?) 같은 Key 를 가진 원소들이 소팅 전후로 순서가 바뀌나 안바뀌나를 의미한다. 2. 정렬의 안정성이 중요한 이유 키가 여러 개인 이유 stability이 중요해진다. how much wood would woodchuck chuck if woodchuck could chuck wood 를 알파벳 순으로 그리고 빈도 수 순으로(내림차순) unstable 하게 정렬한다고 생각하자. 1) 단어 빈도수를 계산한 테이블은 다음과 같고 how 1 much 1 wood 2 would 1 woodchuck 2 chuck 2 if 1 could 1 2) 알파벳 순으로 먼저 정렬하면 (chuck, 2) (could, 1) (how, 1) (if, 1) (much, 1) (wood, .. 더보기
JPA 프록시와 연관관계 관리 1. 프록시 패턴 - 프록시 패턴이란 실제 객체 대신 가상의 객체(Proxy Object)를 사용하는 디자인 패턴이다. 이를 이용하여 실제 객체에 대한 접근 제어 용도로 사용할 수 있다. 프록시 객체에는 실제 객체의 레퍼런스를 가지고 있다. 또한 프록시와 객체 클래스 모두 똑같은 인터페이스를 구현하고 있기 때문에 실제 객체와 동등하게 사용할 수 있다. 클라이언트는 객체를 직접 접근하는 것이 아니라 프록시를 중간에 두고 실제 객체와 데이터를 주고 받는다. 2. JPA에서의 프록시 회원과 팀의 엔터티 관계를 생각할때 비즈니스 로직에 따라 회원을 조회할 때 그와 연관된 팀 엔터티가 항상 필요한 것은 아니다. JPA 에서는 이런 문제를 해결하기 위해 지연로딩을 이용하여 해결한다. (지연 로딩이란 값을 실제 사용.. 더보기
MySQL AUTO_INCREMENT의 문제점 당연하게 AUTO_INCREMENT를 써왔는데, 이 전략이 안좋다는 이야기가 있어서 조사해봤다. 1. AUTO_INCREMENT란? MySQL에서 기본 키를 생성하는 전략이다. INSERT할떄마다 키를 1씩 증가시켜준다. 2. AUTO_INCREMENT 의 문제점 1) 분산형 시스템에서 문제가 발생한다. (실제 규모 있는 시스템은 아래 그림과 같이 여러개의 웹서버와 웹 어플리케이션 서버가 여러개의 데이터베이스로 구성된 분산형 시스템으로 구성되어진다.) 여러 데이터베이스가 있는 상황에서 insert를 한다고 생각하자. 별다른 동기화가 되어있지 않다면, 데이터베이스 A 가 insert를 받으면 1,2,3,4,5,6으로 키가 증가할거고, 데이터베이스 B 또한 insert 쿼리를 받으면 1,2,3,4,5,6으로.. 더보기
Spring Data JPA 1. Spring Data JPA란? 스프링 데이터 JPA는 스프링 데이터의 하위 프로젝트로 JPA 를 한단계 추상한 Repository 인터페이스를 제공한다. 스프링 환경에서 JPA를 사용하게 되면 보통 스프링 데이터 JPA를 사용하게 된다. 스프링 데이터 JPA를 사용하기 위해선 spring-data-jpa 의존성을 추가해야된다. 다음과 같이 추가할수 있다. org.springframework.data spring-data-jpa 2.3.3.RELEASE 스프링 데이터 JPA의 장점은 어플리케이션을 실행할때 Repository 인터페이스를 찾아서 해당 인터페이스를 구현하는 클래스를 동적으로 생성해서 빈으로 등록하기 떄문에 개발자가 직접 Repository 클래스를 구현할 필요가 없다. 2. JpaRe.. 더보기
ORM 과 JPA 1. ORM이란? ORM(Object-Relationship Mapping) 이란 객체와 관계형 데이터베이스의 테이블을 매핑(연결)해주는 것이다. 객체 지향 프로그래밍에서는 클래스를 사용하고, 관계형 데이터베이스에서는 테이블을 사용하기 때문에 형식이 맞지 않는다. 이에 대한 중간다리를 ORM이 해준다고 생각하면된다. 객체와 테이블을 비교해보면 엔터티 간의 관계를 맺을때를 생각해보면 자바에서 객체는 참조를 통해서 관계를 맺는다. 그러므로 멤버가 팀에 속해 있다는 관계를 다음과 같이 표현한다. public class Member { private long id; private String name; private Team team; } 멤버변수를 보면 team의 참조값을(Reference) 갖고있다 멤버의 .. 더보기
JDBC, MyBatis 1. JDBC 란? 자바 어플리케이션에서 데이터베이스(DBMS)에 접근 하기 위한 자바 표준 SQL 인터페이스 API 단, JDBC는 표준적인 API 인터페이스만 제공할 뿐 실질적인 드라이버는 DBMS 제조사에서 제공한다. JDBC 를 사용하기 위해서는 다음과 같이 의존성을 추가 하면된다. org.springframework spring-jdbc 5.2.8.RELEASE 2. JDBC 프로그래밍 흐름 2-1) JDBC Driver 로드 Class.forName("oracle.jdbc.driver.OracleDriver"); forName은 클래스로더로 해당 데이터베이스 드라이버를 JVM에 로드 하는 역할을 한다. https://coneseo.tistory.com/32 Class.forName()의 동작 .. 더보기