Backend

Backend/JPA

영속성 컨텍스트

영속성 컨텍스트란? 영속성 컨텍스트란 엔티티를 영구 저장하는 환경을 의미하고, 애플리케이션과 DB 사이에서 캐시를 이용해 데이터를 보관하는 역할을 한다. 이때 영속성 컨텍스트는 엔티티 매니저를 통해서만 접근이 가능하다. 영속성 컨텍스트에 데이터를 저장하기 위해서는 다음과 같이 저장할 수 있다. EntityManager em = emf.createEntityManager(); em.persist(entity); 영속성 컨텍스트는 환경에 따라 달리 구성될 수 있다. 스프링 같은 멀티 쓰레드 환경에서는 EntityManager : PersistenceContext 관계는 N : 1 관계이고, 단일 쓰레드 환경에서는 1 : 1 관계이다. 이어서 영속성 컨텍스트 내부에서 엔티티의 생명주기에 대해서 살펴보자. 영속..

Backend/Spring

스프링의 빈 후처리기

빈 후처리기라고 얘기를 하면 먼저 떠오르는 것은 @PostConstruct가 떠오를 것이다. 빈을 초기화하는데에 있어서, 초기화 이후 어떠한 작업을 추가해서 하기 위한 애노테이션인데 이 또한 빈 후처리기에 속한다. 오늘은 스프링의 빈 후처리기가 무엇인지 살펴보자. Bean PostProcessor(빈 후처리기) 빈 후처리기란 빈 저장소에 사용될 목적으로 생성할 객체를 빈 저장소에 등록되기 직전에 조작하는 것이다. 따라서, 빈 객체가 스프링 컨테이너에 등록되기 전에 저장 될 객체를 다른 객체로 바꾼다거나, 프록시를 적용한다거나 여러가지가 가능하다. 빈 후처리기 적용 과정 빈 후처리기의 적용 과정은 크게 4가지로 구분 할 수 있다. 1. 생성 : 스프링 빈 대상이 되는 객체를 생성한다. 2. 전달 : 생성된..

Backend/Spring

[Intellij] JUnit Test 시 No tests found for given includes:

Toy 프로젝트의 테스트를 진행하려고 하는데 다음과 같은 오류가 발생했다. 무엇때문인가... 해서 해결방법을 찾아보니 제일 먼저 볼 수 있는 것은 build 에서 test build 옵션을 바꿔주는 것이었다. 하지만 이는 뭔가가 깨름칙했다. 야매로 해결한 기분이랄까... 이어서 찾아보니 여러가지 이유를 찾을 수 있었다. 1. Junit4 에서 Junit5로 넘어오면서 org.Junit.Test 이 아닌 org.Junit.Test.api.Test 를 사용해야 한다. 2. Junit4 에서 Junit5로 넘어오면서 test { useJUnitPlatform() } 를 build.gradle 에 입력해야 한다는 것이었다. 하지만 현재 Spring 2.7.2, Intellij IDEA 2022.3 에서는 제대로..

Backend/Spring

자바 리플렉션과 이를 이용한 JDK 동적 프록시와 CGLIB

기존 데코레이터 패턴과 프록시 패턴의 문제 JDK 동적 프록시와 CGLIB 둘 다 데코레이터 패턴 혹은 프록시 패턴을 사용하는데 있어서 동적으로 수행해주는 도구입니다. 기존에 데코레이터 패턴과 프록시 패턴의 가장 큰 문제는 해당 패턴을 적용하기 위해서는 해당 패턴이 사용되어야 할 코드를 재사용하지 않고, 또 해당 템플릿을 사용하기 위해 패턴을 사용해야 할 클래스들을 생성해주어야 한다는 큰 문제가 있었습니다. 예를 들어서, 해당 패턴을 적용할 클래스가 100개라면 패턴을 적용하기 위한 클래스를 100개를 만들어주어야 한다는 것이지요. 만약 프록시 체인으로 구성되어 있다면, 200개, 300개 몇 개 까지 늘어날 지 알 수가 없습니다. 이를 해결하기 위해서 자바에서 제공해주는 JDK 동적 프록시와 외부 라이..

Backend/Spring

프록시

다음 포스팅에 스프링 AOP에 사용되는 프록시 패턴과 데코레이터 패턴을 배우기 전에 해당 패턴에 사용되는 프록시란 무엇인지 자세하게 알 필요가 있을 것 같아서 프록시에 대해서 먼저 포스팅을 하게 되었습니다. 프록시 프록시 그 자체적인 의미는 대리자라는 의미를 가지고 있습니다. 프록시를 이제 객체에 대해 적용하느냐, 서버에 대해 적용하느냐에 대해서 이제 대리자로서 다르게 동작할 뿐입니다. 참고로 프록시 서버의 정의는 다음과 같습니다. 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램 출처 : 위키피디아 간접적이라는 말이 보이시죠? 클라이언트의 요청을 대리자로서 접속할 수 있게 해준다는 것입니다. 그럼 여기서 클라이언트라는 말이 나왔으니, ..

Backend/Spring

템플릿 콜백 패턴

이전에 템플릿 메서드 패턴 포스팅에서 JdbcTemplate가 템플릿 메서드 패턴을 개선한 전략 패턴과 이를 이용한 스프링의 템플릿 콜백 패턴을 통하여 구현이 된다고 포스팅을 했었는데, 오늘은 그 템플릿 콜백 패턴이 어떻게 구성되는지 알아보는 시간입니다. JdbcTemplate 말고도, TransactionTemplate, RedisTemplate 등등 많은 부분에서 활용되기 때문에 해당 패턴을 이해하고 나면 이제 그림이 그려지실거라 생각합니다. 그럼 들어가기에 앞서서 먼저 콜백에 대해서 알 필요가 있습니다. 콜백이란? 프로그래밍에서 콜백(callback) 또는 콜애프터 함수(call-after function)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백..

Backend/Spring

스프링의 싱글톤 패턴으로 인한 동시성 문제와 그 해결

스프링의 동시성 문제와 해결 스프링은 기본적으로 빈을 등록할 때, 싱글톤 패턴으로 스프링 컨테이너에 하나의 객체만 가지고 있는 형태를 띄고 있다. 하나의 객체만을 가지고 있기 때문에, 톰캣같은 WAS는 멀티 쓰레드를 지원하기 때문에, 하나의 객체에 여러 클라이언트들이 접근을 하게 되었을 때, 데이터의 변경이 발생한다면 동시성 문제가 발생한다. 동시성 문제란 동시성 문제는 임계 영역에 각기 다른 쓰레드가 동일한 데이터에 접근하고 어떠한 쓰레드가 임계 영역의 데이터를 변경하려고 할 때 발생을 하게 되는데, 임계 영역이란 어떠한 자원을 공유할 수 있는 공간을 말한다. 따라서, 우리가 코드를 사용할 때, 임계영역이 발생할 수 있는 부분은 static 변수를 선언하거나 혹은 싱글톤 패턴으로 인해 새로운 객체의 생..

Backend

java Test 코드 작성 시 lombok을 사용할 수 없는 경우 해결법

때때로 스프링 프로젝트에서 테스트 패키지의 테스트 메소드에서 롬복을 사용하려고 하는 경우가 있다. 하지만 main 패키지에서는 잘 되는데 test 패키지에서는 안되는 경우가 종종 발생한다. build.gradle 에 다음과 같은 내용을 추가해주어야 한다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' // 아래에 testCompil..

Bombo_
'Backend' 카테고리의 글 목록 (3 Page)