정의JWT(Json Web Token) 는 RFC 7519 에 명세되어 있는 국제 표준으로써, 통신 양자간의 정보를 JSON 형식을 사용하여 안전하게 전송하기 위한 방법입니다. 이는 정보가 토큰 자체에 포함된 (Self-Contained) 토큰입니다.구성요소JWT는 '.' 구분자를 사용하여 Header, Payload, Signature 의 3부분으로 구분되며, 각 부분은 Base64 로 인코딩 되어 표현됩니다. (Base64 은 Binary Data 를 6 bit 씩 자른 뒤 6 bit 에 해당하는 문자를 색인표에서 찾아 Text 로 변경하는 인코딩 방법입니다. ) 1. 헤더(HEADER)는 해싱 알고리즘(alg) 과 토큰 타입 (typ) 의 정보를 지니고 있습니다.- alg : 기본적으로 HMAC, ..
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..
특정 엔티티의 총 개수 를 조회하기 위해서 QueryDSL 의 fetchCount() 메서드를 사용했습니다.하지만, fetchCount() 메서드가 회색 처리되고, 취소선이 나타나는 것을 발견했습니다. Warning 메세지에는 'fetchCount(): Long' is deprecated. 라는 내용이 뜨는데, 그 이유와 해결 방법에 대해 알아보겠습니다. fetchCount(), fetchResulsts() 의 Deprecation저희 팀이 사용하는 QueryDSL 5.0.0 버전부터는 fetchCount() 가 deprecated 되었습니다. 이 메서드가 더 이상 권장되지 않는 이유는 공식 문서에서 다음과 같이 설명하고 있습니다. fetchCount() 는 쿼리 결과의 개수를 계산하기 위해서 count..
엔티티를 저장한 후, 그 정보를 이메일로 보내는 기능을 구현하였습니다. 이메일을 전송하는 작업은 시간이 오래 걸리는 작업이므로, 이를 비동기적으로 처리하기 위해 메세지 큐를 사용하였습니다. 저희 팀은 AWS 의 SQS(Simple Queue Service) 를 사용하고 있습니다. 간단하게 예시를 들어보겠습니다. 우선 메세지 전송 처리부터 구현해보겠습니다.@Transactionalfun create(seller: Seller, inquiry: Inquiry): InquiryHistory { val inquiryHistory = inquiryRepository.save(InquiryHistory( inquiry = inquiry, actionAt = ZoneDateTime.n..
문제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 메서드를..
트랜잭션이란? 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위이다. 데이터베이스 상태를 변화시키는 것은 질의어(SELECT, INSERT, DELETE, UPDATE)로 데이터베이스에 접근하는 것을 말한다. 이때, 작업의 단위는 질의어 한 문장이 아니다. 예를 들어, 상품을 구매하면 포인트를 적립하는 비즈니스 로직이 구현되기 위해서는 1. 상품을 구매한 구매내역을 데이터베이스에 등록하고 2. 그 상품을 구매한 사용자의 포인트 점수를 갱신해주어야 한다. 여기서 작업단위는 구매내역을 등록하는 INSERT문과 사용자의 포인트 점수를 갱신하는 UPDATE문을 합친 것이다. 이러한 작업단위를 하나의 트랜잭션이라고 한다. 쉽게 말해 데이터베이스에 하는 여러 개의 작업들이 마치 하나의 그룹처럼 묶여서 처..
- Total
- Today
- Yesterday
- JPA
- 영속 상태
- entitylisteners
- CI와 CD의 차이
- aws
- 영속성 컨텍스트
- 정렬
- acm
- LeetCode
- java
- appliationeventlistener
- Route53
- Hibernate
- Spring Boot
- DevOps
- network
- githubactions
- fetchcount()
- 지연 대기열
- 자바
- CodeDeploy
- persistencecontext
- 프로그래머스
- Spring
- EC2
- CI/CD
- 네트워크
- IAM
- 트랜잭션
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |