JPA 에서 가장 중요한 개념이라고 하면 연관관계 매핑과 영속성 컨텍스트가 있다. 이번 포스팅에서는 이 중에서 연관관계 매핑에 대해서 이야기해보려고 한다. 객체지향 프로그램에서의 객체와 RDB 에서의 테이블이 서로 연관관계를 맺는 방법이 다르다. 그렇기 때문에 이 둘의 차이를 채우기 위한 매핑과정이 필요하고 이를 ORM 인 JPA 가 수행하게 된다. 연관관계에서는 아래와 같은 용어들이 등장한다. 방향(Direction) : 단방향 연관관계, 양방향 연관관계 다중성(Multiplicity) : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 연관관계의 주인(Owner) 데이터 중심의 모델링 JPA 에서 해주는 연관관계 매핑에 대해서 알아보기에 앞서 잘못된 연관관계 방법에 대해서 살펴보..
CompletableFuture future = asyncRestTemplate.exchange(...) .handleAsync((responseEntity, throwable) -> { if (throwable instanceof HttpClientErrorException) { throw new CustomException(((HttpClientErrorException) throwable).getStatusCode()); } else if (throwable instanceof RestClientException) { throw new CustomException(500); } return responseEntity; }); 실제 프로젝트에서 위와같은 코드를 사용했는데 throw new 라인에서 다..
이번 포스팅에선 IoC & DI, Spring AOP 와 함께 Spring 의 3대 특징인 Spring PSA 에 대해서 살펴보려고 한다. Spring PSA 란? Spring PSA 는 Portable Service Abstraction 의 약자로 휴대용 서비스 추상화라는 의미를 가진다. 우선, 서비스 추상화란 무엇일까? 특정 서비스가 추상화되어있다는 것은 서비스의 내용을 모르더라도 해당 서비스를 이용할 수 있다는 것을 의미한다. 예를 들어, 우리는 JDBC Driver 를 사용해 데이터베이스에 접근하지만 JDBC Driver 가 어떻게 구현되어 있는지는 관심이 없다. 실제 구현부를 추상화 계층으로 숨기고 핵심적인 요소만 개발자에게 제공함으로써 실제 구현부를 모르더라도 해당 서비스를 이용할 수 있도록 ..
순환참조문제란? 위 예외는 애플리케이션 로딩 과정에서 순환참조가 발생함을 알리는 예외이다. 순환참조 문제란 A 클래스가 B 클래스의 Bean 을 주입받고, B 클래스가 A 클래스의 Bean 을 주입받는 상황처럼 서로 순환되어 참조할 경우 발생하는 문제를 의미한다. 그럼 이러한 순환참조 문제는 어떠한 상황에서 발생하는지 살펴보자. 왜 발생할까? 특정 클래스에서 IoC 컨테이너에 있는 Bean 을 주입받기 위해서 세 가지 방법을 사용할 수 있다. 필드 주입방식, Setter 주입방식, 생성자 주입방식이 이에 해당한다. 갑자기 의존성 주입 방식에 대해서 이야기하는 이유는 생성자 주입방식과 나머지 두 가지 주입방식에서의 순환참조문제가 조금 다르게 발생하기 때문이다. 먼저, 필드 주입방식과 Setter 주입방식에..
Spring Cloud Config 란? Spring Cloud Config 는 분산 시스템에서 설정 정보(application.yml) 를 외부에 보관할 수 있도록 지원해주는 서비스이다. 이러한 Spring Cloud Config 를 이용했을 때 얻을 수 있는 장점은 다음과 같다. 여러 서버의 설정 파일을 중앙 서버에서 관리할 수 있다. 서버를 재배포 하지 않고 설정 파일의 변경사항을 반영할 수 있다. 위 도식은 Spring Cloud Config 가 동작하는 과정이다. 조금 간단하게 설명하자면 우선 세 가지 요소로 생각하면 좋다. 실제로 설정파일이 저장되는 Config 저장소(Git Repository, File System 등)가 있고, 이러한 저장소와 연결되어 설정파일을 관리해주는 Spring C..
Servlet 3.0 이전 Servlet 3.0 에는 Servlet Thread 만 존재했다. 예를들어 Thread per Request Model 을 사용하는 Tomcat 의 경우에는 기본적으로 200개의 Servlet Thread 를 가졌고 내부적으로 Blocking 되는 코드가 있다면 서버의 Latency 가 길어지게 된다. 왜냐하면 하나의 Request 에 대해서 하나의 Servlet Thread 를 할당하게 되는데, 해당 Servlet Thread 가 Blocking 상태에 빠지게 된다면 더 이상 Servlet Thread Pool 에는 남아있는 Thread 가 없게되고 Request 는 Servlet Thread 가 반환될 때까지 기다리게 되는 것이다. 이러한 문제를 해결하기 위해 Servle..