본문 바로가기

spring

(24)
Spring AOP - Aspect, Proxy, Self-Invocation 스프링에서 디버깅을 하며 실행 흐름을 추적하다 보면 내가 짠 적 없는 클래스와 메서드들을 마주하게 됩니다....Proxy, ...Intercepter 등의 클래스들이 실행 스택 트레이스의 상당 부분을 차지하는 것은 AOP가 동작하고 있다는 증거가 됩니다! 이번 글에서는 애스팩트와 프록시가 무엇인지, 왜 디커플링을 가능하게 하는지에 대해 정리합니다. 애스팩트(Aspect) 코드를 짜다보면 핵심 비즈니스 로직이 아니더라도 로깅, 트랜잭션 관리 등 여기저기서 공통적으로 필요한 기능들이 생깁니다.애스팩트(Aspect)는 이러한 공통 기능들을 한 곳에 모아 관리하는 모듈입니다.즉, 부가 기능의 내용과 해당 부가 기능을 어디에 적용할지를 정의한 것! 이렇게 애스팩트를 사용하는 프로그래밍 방식은 AOP(관점 지향 ..
JPA Specification - 복잡한 검색 조건 처리하기 (vs QueryDSL) JPA Specification이란?: JPA에서 동적 쿼리를 조합할 수 있게 도와주는 WHERE 절 조건 빌더조건을 메서드 단위로 나누고, 조합할 수 있도록 함→ where 절의 조건 하나하나를 Specification 객체로 만들고, 이를 .and(), .or() 등으로 조립한다 ! 기본 사용법 1. Repository에 JPASpecificationExecutor 확장public interface UserRepository extends JpaRepository, JpaSpecificationExecutor {} 2. Specification 정의public class UserSpecification { public static Specification hasName(String name) ..
더티 체킹(Dirty Checking) - 개념 및 주의사항 / @DynamicUpdate 더티 체킹(Dirty Checking)이란?: JPA가 트랜잭션 커밋 시점에 영속성 컨텍스트에 저장된 엔티티 객체의 상태 변경 여부를 감지하여, 자동으로 DB에 반영해주는 기능 언제 발생할까? 1. 트랜잭션 안에서 2. 영속 상태(EntityManager가 관리 중)인 엔티티에 대해 3. save() 등의 메서드 없이 필드를 변경만 하고 4. 트랜잭션이 commit될 때 → JPA가 내부적으로 flush()를 수행, 이전 스냅샷과 비교해서 변경이 감지되면 UPDATE 쿼리를 날린다 !flush()란?: 영속성 컨텍스트의 변경 내용을 DB에 반영하는 동작→ 트랜잭션 commit 직전에 JPA가 자동으로 호출, 이 시점에 더티 체킹이 수행됨 예)@Transactionalpublic void updateUs..
@Transactional 이해하기 - 내부 동작 및 주의사항 포함 @Transactional이란?: spring에서 지원하는 트랜잭션을 선언적으로 처리하기 위한 어노테이션주로 DB 작업을 수행하는 Service 계층에서 사용되며, @Transactional이 적용된 메서드를 실행하면 트랜잭션이 시작되고 메서드 정상적 종료 시 commit / 예외 발생 시 rollback→ 이러한 흐름을 자동으로 처리해줌 ! 내부 동작 원리 @Transactional은 프록시 기반 AOP 기술로 동작즉, 실제 서비스 객체를 감싸는 프록시 객체가 생성되고 이 프록시가 메서드 호출을 가로채 트랜잭션을 관리 → 프록시가 메서드 실행 전후에 트랜잭션 시작 / 커밋 / 롤백 수행프록시(Proxy)란?: 객체를 감싸서 실제 객체 호출 전/후에 부가적인 처리를 하는 중간 객체Spring에서는 대표..
로깅(Logging) 로깅의 필요성애플리케이션 디버깅, 문제 해결, 모니터링, 에러 리포트를 위한 필수 도구!예) 디버깅 - 고객의 문제 상황을 개발 환경에서 에러 재현할 수 없는 경우도 있음디버거 만으로는 한계가 존재로그를 사용하면 로그를 기록하는 상황에 따라 커스터마이징, 정보를 간략하게 혹은 더 상세하게 표시할 수 있게 구성이 가능함대표적인 로깅 요소에러예상하지 않은 동작 (버그)애플리케이션 변경 추적주요 이벤트 (서비스 / 모듈 시작과 종료, 로그인 등) 알림제대로 서비스가 동작하고 있는지에 대한 정보성 알림 무엇을 기록할 것인가? - 로그 콘텐츠항목세부 내용Error메시지, 스택 추적, 에러 발생 시 애플리케이션이 실행하고 있던 작업Debugging디버깅 시 필요한 세부 추적 정보적용되는 변수 값, 메서드 등 실행에..
영속성 전이 영속성 전이 (cascade)특정 엔티티끼리 생명주기가 같은 경우가 있음예) 글(post)이 삭제되는 경우 글에 달린 댓글(comment)들은 독립적으로 존재할 수 없기 때문에 글이 삭제될 때 같이 삭제되어야 함엔티티 생명주기가 다른 엔티티와 연관되어 있는 경우 영속성 전이(cascade)를 사용해 관리@ManyToOne(cascade=CascadeType.ALL) 엔티티 생명주기 영속성 전이 타입 종류종류설명ALL모든 작업(상태)에 대해 영속성 전이PERSISTPersist할 때 연관된 엔티티도 PersistMERGE엔티티를 영속성 컨텍스트에 Merge할 때 연관 엔티티도 MergeREMOVEDB와 영속성 컨텍스트에서 연관 엔티티도 제거REFRESH엔티티 새로고침 시 연관 엔티티도 새로고침DETACH엔..
다대일 단/양방향 매핑 다대일(N:1) 단방향 매핑 예)1. 댓글(comment)들은 하나의 글(post)에 달려있음 (댓글 N : 글 1)2. 댓글을 조회했을 때, 댓글이 속해있는 글도 같이 조회됨3. 글을 통해 댓글에 접근할 수 없음comment 엔티티에 매핑 설정을 추가글(post) 객체는 댓글(comment)로부터 참조 당하는 것, 참조할 필요 없으므로 추가할 설정은 없음 다대일(N:1) 양방향 매핑 예)1. 댓글(comment)들은 하나의 글(post)에 달려있음 (댓글 N : 글 1)2. 댓글을 조회했을 때 댓글이 속해있는 글도 같이 조회됨3. 글을 통해서도 댓글에 접근할 수 있음mappedBy="post" ≫ "post"는 comment의 post 필드 양방향 매핑과 주인 (owner)누가 FK를 관리(등록/수정)..
연관관계 매핑 종류 / 방향 객체지향에서는 여러 객체에 나누어 객체 간 협력을 하며 기능≫ 객체들을 서로 연결할 수 있도록 객체 간 참조 사용!≫ 객체지향과 DB 간의 차이 발생객체지향 : 객체 간 참조를 사용해 객체들을 연결DB : 테이블의 외래키를 사용해 정규화 연관관계 매핑JPA에서 성능을 결정하는 중요한 요소연관관계 설정을 통해 객체 '참조'와 테이블의 FK를 매핑시켜 사용방향성(Direction), 다중성(Multiplicity) ≫ 두 가지 기준 존재 방향성 (Direction)방향설명단방향두 엔티티 관계에서 한쪽 엔티티만 참조양방향두 엔티티 관계에서 양쪽 엔티티가 서로 참조: A → B, B → A  예)1. 게시글 객체가 참조 변수를 통해 댓글 객체만 참조하면 ≫ 단방향 2. 댓글 객체도 게시글 객체를 참조 변수를 통..