1단계 : HTTP Request / Response 로그를 어디에서 처리해야 할까?HTTP Request / Response 로그는 공통 처리가 필요한 영역입니다. 이를 처리하기 위한 방법으로 주로 사용되는 세가지가 있습니다. 1. Servlet FilterServlet Filter 는 Dispatcher Servlet 의 전 / 후에 동작하며, 사용자의 요청이나 응답을 가장 먼저 마주합니다. 필터는 스프링의 고유 기능이 아니라 자바 서블릿에서 제공하는 기능입니다. Filter 는 동일한 Servlet Container (e.g Tomcat) 내에서 필요한 자원들을 활용하여 동작합니다. 2. Handler InterceptorInterceptor 는 Dispatcher Servlet 이 실행된 후 호..
왜 Entity Listener를 적용하였는가?지난 게시글에서 엔티티를 생성하거나 수정할 때 해당 엔티티의 인덱스를 생성 및 수정하는 작업을 위해 ApplicationEvent를 도입하여 서비스 간의 결합도를 줄이고, 트랜잭션 문제를 개선할 수 있었습니다. 그러나 지난 게시글에서 ApplicationEvent를 사용하는 방식에는 한 가지 단점이 있습니다. 매번 엔티티를 생성하거나 수정할 때마다 applicationEventPublisher.publishEvent() 메서드를 호출하는 코드를 작성해야 한다는 점입니다. 아래의 코드처럼 모든 이를 위해 모든 비즈니스 로직에서 일일이 이벤트 발행 코드를 추가해야 합니다.class UserService( private val userIndexService:..
왜 Application Event 를 도입하기로 하였는가.ElasticSearch를 사용하여 검색 기능을 구현하면서, 엔티티를 생성하거나 수정할 때 해당 엔티티의 인덱스를 생성 및 수정하는 작업도 함께 수행해야 했습니다. 기존 코드에서는 User 객체를 생성할 때 UserService에서 UserIndexService를 의존성 주입받아 사용하며, User 객체 생성 후 인덱스를 생성하는 방식으로 구현되었습니다.class UserService( private val userIndexService: UserIndexService) { @Transactional fun create(name: String, identity: Identity) : User { val user = U..
문제Seller 와 1:N 관계를 가지고 있는 SellerUsers 의 첫번째 요소를 가지고 오기 위해서 List 클래스의 first() 메소드를 호출하였을 때 예외가 발생하였습니다. 이와 관련하여 간단하게 코드로 구현하였습니다.class Class1Service( private val sellerService: SellerService private val class2Service: Class2Service) { fun call()(sellerId) { val seller = sellerService.findSeller(sellerId) class2Service.call(seller) }}Class1Service.call() 메소드에서 sellerId 를 ..
엔티티의 생명주기는 영속성 컨텍스트와의 관계를 통해 이해할 수 있습니다. 엔티티가 영속성 컨텍스트 내에서 어떤 상태에 있는지에 따라, 그 생명주기는 크게 네 가지로 구분됩니다 : 비영속(New), 영속(Managed), 준영속(Detached), 삭제(Removed) 입니다. 1. 비영속 상태(New)엔티티가 아직 영속성 컨텍스트에 저장되지 않은 상태로, 데이터베이스와는 전혀 연관이 없습니다. 예를 들어, 'new' 키워드로 새롭게 생성된 객체는 비영속 상태입니다.Member member = new Member();member.setId(1L);member.setName("1번 사용자"); 2. 영속 상태 (Managed)엔티티가 영속성 컨텍스트에 의해 관리되는 상태입니다. 이 상태에서 엔티티는 데이터베..
영속성 컨텍스트(Persistence Context)이란?영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에 위치해 엔티티를 영구 저장(영속)하는 가상의 데이터베이스입니다. 이는 논리적인 개념으로, JPA에서 엔티티의 생명주기를 관리하고, 데이터베이스와의 상호작용을 최적화하는 역할을 합니다. 이번 글에서는 영속성 컨텍스트에 어떻게 접근하는지, 영속성 컨텍스트의 구성요소는 무엇인지, 그리고 영속성 컨텍스트가 어떤 일을 하는지 알아보겠습니다. 영속성 컨텍스트 접근하에 접근하는 도구 EntityManager 와 그를 생성하는 EntityManagerFactoryEntityManager 는 영속성 컨텍스트에 접근할 수 있는 주요 인터페이스입니다. 예를 들어, entityManager 는 persist 메서드를..
Spring 의 생명주기를 알고자 한다면,,,Spring의 생명주기는 스프링 컨테이너와 그 안에서 관리되고 있는 스프링 빈의 생명주기에 따릅니다. 스프링 컨테이너는 애플리케이션의 설정 정보를 바탕으로 애플리케이션에서 사용할 객체(빈)를 생성하고 관리합니다. 이 과정에서 스프링 컨테이너와 빈 객체는 각자의 생명주기를 가지며, 이 생명주기는 서로 밀접하게 연결되어 있습니다. 스프링 컨테이너의 생명주기스프링 컨테이너의 생명주기는 크게 세 단계로 나눌 수 있습니다: 1. 컨테이너 초기화: 스프링 컨테이너를 생성하고 설정 파일 또는 클래스에서 정의된 빈들을 초기화합니다.2. 컨테이너 사용: 애플리케이션이 실행되는 동안, 컨테이너는 빈을 제공하고, 빈은 필요한 작업을 수행합니다.3. 컨테이너 종료: 애플리케이션이 ..
스프링 컨테이너란? 1. 자바 객체의 생명주기를 관리하고 2. 생성된 자바 객체에게 부가 기능을 제공한다. 스프링에서는 자바 객체를 '빈(Bean)'이라고 부른다. 즉, 스프링 컨테이너는 스프링 빈의 생명주기를 관리하고, 생성된 스프링 빈에게 부가 기능을 제공한다. 스프링 컨테이너는 ApplicationContext라고도 부른다. 좀 더 상세하게는 스프링 컨테이너는 ApplicationContext가 상속하고 있는 인터페이스 'BeanFactory'와 구분해서 사용하지만, BeanFactory를 직접 사용하는 경우는 거의 없어 일반적으로 ApplicationContext를 스프링 컨테이너라고 한다. BeanFactory는 스프링 컨테이너의 최상위 인터페이스다. 1. BeanFactory는 빈의 생성과 관..
MapStruct 와 Lombok 설정 순서로 인한 문제 해결최근에 MapStruct를 사용하여 DTO를 Entity로 변환하는 MemberMapper를 작성했습니다. 처음에는 정상적으로 작동할 거라 예상했지만, 빌드를 하고 난 후 생성된 MemberMapperImpl에서 기대했던 결과를 얻지 못했습니다. 문제 상황작성한 코드는 다음과 같습니다.MemberMapper@Mapper(componentModel = "spring")public interface MemberMapper { Member memberPostToMember(MemberPostDto requestBody);}MemberPostDto@Getter@AllArgsConstructorpublic class MemberPostDto { ..
상황회원 정보를 postman을 이용해서 데이터베이스에 저장하기 위해 다음과 같은 요청을 하였다.{ "email":"hgd@gmail.com", "name":"홍길동", "phone" : "010-1234-5555"} 에러코드Internal Server Error가 발생하여, 확인해보았더니 다음과 같은 에러가 발생하였다. 원인식별자로 저장된 후에는 null 값이면 안된다라는 오류이다.memberRepository로 저장하려는 것은 Member 객체이었고, 이를 식별하는 것은 Member클래스에 memberId이다.Member를 저장하면 memberId가 자동으로 증가하며 생성해준다. 해결방안1. sql문 확인CREATE TABLE IF NOT EXISTS MEMBER ( MEM..
- Total
- Today
- Yesterday
- 지연 대기열
- 네트워크
- acm
- DevOps
- entitylisteners
- persistencecontext
- 자바
- Spring Boot
- 정렬
- 영속성 컨텍스트
- CI/CD
- Route53
- network
- appliationeventlistener
- JPA
- 트랜잭션
- fetchcount()
- CI와 CD의 차이
- springboot
- IAM
- 프로그래머스
- 영속 상태
- LeetCode
- aws
- java
- EC2
- Hibernate
- Spring
- githubactions
- CodeDeploy
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |