[개발 일기] 2025.01.05 - 자바 객체 락 (synchronized)
·
개발 일기
개요 우리가 보통 동기화 환경을 구축할 때, 아래의 예제 코드와 같이 동기화 환경이 설정된 메서드에 진입하기 위해선 락을 획득해야 한다고 한다. public OrderService { ... public synchronized void createOrder(OrderCreateRequest request) { // 주문 생성 & 재고 차감 로직 } ... } 그렇다면 이 락이 뭐고, 도대체 어디에 있는지에 대해 알아보자   락 락(Lock)은 동기화를 구현하기 위한 기술로, 여러 스레드(사용자)가 공유 리소스에 접근할 때 데이터의 무결성을 보장하기 위해 사용된다. 락은 동시에 하나의 스레드만 특정 리소스에 접근할 수 있도록 제어하는 역할을 한다.  쉽게 설명하면 데이..
[개발 일기] 2025.01.04 - Event, Publisher, Listener
·
개발 일기
개요 프로그래밍 환경에선 이벤트라는 말이 자주 사용된다.  그리고 이벤트는 Publisher와 Listener와 함께 사용된다.  늘 개발할 때마다 Event, Publisher와 Listener는 자주 봤지만, 내부 기능과 사용목적은 확실하게 알지 못했다.  오늘은 이 세 가지 객체의 목적을 알아보자.   Event Spring의 Event란 스프링 애플리케이션 내부에서 발생하는 작업이나 상태변화를 나타내는 객체이다.  무슨 말인지 모르겠다. 쉽게 설명해 보자.  예를 들어 "홍길동 사용자가 회원가입을 했다", "홍길동 사용자가 로그인에 성공했다" 같은 상황이 이벤트를 의미한다.  그리고 이 이벤트는 다른 리스너(Listener)가 "어? 무슨 일이 있었네!" 하고 알아차릴 수 있게 도와주는 일종의 메..
[개발 일기] 2025.01.03 - Redis의 만료기한
·
개발 일기
개요 OKKY에서 Access 토큰과 Refresh 토큰에 관한 이야기를 나누는 것을 봤다.  그리고 자연스럽게 Redis와 만료기한과 관련된 내용도 나왔는데, 이때 갑자기 떠오른 기억이, 이전까지 Refresh 토큰이나 임시 예약과 같은 기능을 사용할 때 Redis의 만료기한도 함께 사용했었던 기억이었다.(임시 예약에 Redis의 만료기한을 사용한 이유는 최종 결제가 성공적으로 이루어지지 않는 경우 해당 예약은 취소해야 하기 때문!)  그때 당시엔, ‘알아서 데이터도 삭제해 주네? 이거 편하네~’라고 생각하고 대수롭지 않게 넘겼는데, 이게 무슨 원리 때문인지, 단순한 인메모리 DB의 특징인 건지 궁금해서 일기를 쓴다.   인메모리 DB 인메모리 DB란 명칭 그대로, 메모리에 직접 데이터를 저장하고 읽는..
[개발 일기] 2025.01.02 - @Transactional (readOnly = true)
·
개발 일기
개요 오늘 가져온 주제는 읽기 전용 트랜잭션인 @Transactional(readOnly = true)이다.  오늘 이전에 읽은 책 자바 ORM 표준 JPA 프로그래밍을 읽다가 Service 구현체에 @Transactional(readOnly = true)을 기본적으로 달고, 해당 클래스의 메서드 중 데이터베이스에 변경을 가하는 작업을 수행하는 메서드라면 @Transactional을 작성해 따로 처리하는 것이 성능에서 더 이득일 수 있다는 글을 보고 그 이유가 무엇인지 한번 더 공부해보고 싶어졌다.   @Transactional @Transactional 은 데이터베이스의 작업에서 일관성과 무결성을 보장하기 위해 사용하는 어노테이션이다.  그렇기 때문에 @Transactional 어노테이션이 달린 메서드..
[개발 일기] 2025.01.01 - 도커 컨테이너 네트워크 (Feat : ports)
·
개발 일기
개요 SSAFY 시절부터 docker-compose를 작성할 때, 저 ports가 뭘 의미하는지 항상 궁금했다.  검색해서 찾아보면 대부분 “호스트 포트:컨테이너 포트” 이런식으로 외웠다.  그런데 이런 식으로 단순하게 외우니까 저 포트를 볼 때마다 늘 까먹어서 제대로 공부해봤다.   호스트 포트와 도커 컨테이너 포트 위의 그림으로 확실하게 설명 가능하다.  사용자가 호스트의 특정 포트로 요청을 보내면, 해당 포트와 바인딩되어 있는 컨테이너를 찾은 뒤 해당 컨테이너에 요청을 전달하는 것이다.  위의 이미지는 도커 컨테이너를 실행시킨 뒤, 내부 네트워크를 확인한 로그이다. 노란색 네모를 보면 각각의 컨테이너가 서로 다른 IP를 사용중인 것을 알 수 있다.  호스트 포트는 내가 사용중인 로컬의 포트번호를 의..