본문 바로가기

스프링 부트

(30)
[JPA 프로그래밍 기본기 다지기] JPA 내부구조 노트 2021-05-29글 영속성 컨텍스트 엔티티를 영구히 저장하는 환경 영속성 = 영구히 저장하는 속성 EntityManager.persist(entity) 영속성 컨텍스트는 논리적인 개념 (눈에 보이지 않음) 엔티티 매니저를 통해 영속성 컨텍스트에 접근 스프링 프레임 워크에서의 영속성 컨텍스트 엔티티 매니저와 영속성 컨텍스트가 N:1 같은 트랜잭션이면 같은 영속성 컨텍스트에 접근 엔티티 매니저 팩토리와 엔티티 매니저 요청이 들어와 이걸 처리하는 스레드가 하나 생성될 때마다 새로운 엔티티 매니저를 만든다. 엔티티 매니저에서 내부적으로 데이터베이스 커넥션 풀에서 JPA를 사용 엔티티의 생명 주기 비영속 (New) 객체를 생성한 상태 Team team = new Team(); team.setName("teamA..
@PostConstruct와 @PreDestroy Spring에서는 빈의 생성과 소멸을 어노테이션으로 관리할 수 있다. @PostConstruct Spring은 빈 초기화 직후에 @PostConstruct이 달린 메서드를 한 번만 호출한다. 만약 초기화할 것들이 없는 경우에도 해당 메서드는 실행이 된다. @PostConstruct가 달린 메서드는 모든 접근 제어자를 가질 수 있지만 static 메서드일 수는 없다. Example 애플리케이션 구동 시 더미 데이터가 필요한 경우 - (근로) 해당 더미 관련 Service에서 관련 Repository 빈 초기화가 이루어진 후 @PostConstruct가 붙은 메서드가 실행되면서 더미데이터를 넣을 수 있다. 사실 이 전에 더미데이터 넣는 방법을 무조건 ApplicationRunner를 구현한 DataLoade..
Logback과 로깅 전략 Logback 이란? 자바 오픈소스 로깅 프레임워크, SLF4J의 구현체 log4j, log4j2 등과 성능을 비교했을 때에도 logback이 더 훌륭한 성능 (괸련 링크) spring-boot-starter-web 안에 spring-boot-starter-logging에 구현체 존재 Spring Boot의 경우 logback-spring.xml 파일을 resources 디렉토리에 만들어서 참조 Logback의 참고 순서 classpath(resources디렉토리 밑)에 logback-spring.xml파일이 있으면 설정파일을 읽음 logback-spring.xml파일이 없다면 .yml(.properties)파일의 설정을 읽음 logback-spring.xml파일과 .yml(.properties)파일이 ..
[ERROR] Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 이 문제를 어떻게 겪게 되었나면.... UT를 진행 중, SQL 인젝션을 테스트 해 본다고 구구가 닉네임 입력 자리에 `where id = `를 그대로 입력했는데 바로 에러가 터지고 말았다. 닉네임을 입력하면 바로 입력한 닉네임이 중복디 되지는 않았는지 검증하는 API에게 요청을 보내는데, 여기서 예외가 발생한 것이다. 우리는 '여기서 SQL 인젝션 공격이 먹혀서 에러가 터졌나?' 의문을 품고 있었지만, 구구는 스프링 부트에서는 이미 SQL 인젝션 공격을 막고 있다고 하셨는데 여기서만 터지는게 이상하다고 하셨다. UT를 마치고 우리는 이 에러가 왜 터졌을까 고민하다가 고민하다 에러 로그를 하나씩 살펴보기 시작했다. 일단 먼저 네트워크 탭에서 해당 API의 응답이 우리가 정의해준 예외가 아닌 애초에 OPT..
ApplicationEventPublisher 적용과 그 안에서의 삽질 ApplicationEventPublisher 이벤트 핸들러는 이벤트 생성 주체가 발생한 이벤트에 반응하고, 이벤트 핸들러는 생성 주체가 발행한 이벤트를 전달받아 이벤트에 담긴 정보(데이터)를 기반으로 해당 기능을 수행 놀토에서 ApplicationEventPublisher 우리는 사용자에게 어떤 특수한 이벤트가 발생했을 때 Event 테이블에 해당 이벤트 정보를 저장하여야 한다. ex) 자신의 피드에 댓글이 달렸을 때, 자신의 피드에 좋아요가 눌렸을 때 이제부터 우리 알림 기능을 ApplicationEventPublisher로 구현해야하는 이유를, 이를 사용하지 않을 시 문제점을 보며 나열해본다. ApplicationEventPublisher를 쓰지 않았을 때의 문제 기존 로직에 결합도가 높아진다 현재..
[JPA] Cascade 간단 노트 2021-07-08글 JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다. 부모 엔티티를 영속 상태로 만들 때 연관된 자식도 한번에 영속 상태로 만들 수 있다. Cascade란? 영속성 전이 연관관계에 있는 엔티티에 작업이 이루어져 상태 변화가 이뤄질 시 동일한 작업이 연결된 엔티티에 전이되는 옵션 일반적으로 부모 엔티티에서 cascade 옵션을 걸어줌 자식에서 부모로 옵션을 거는 것은 의미가 없다고함 즉시로딩, 지연로딩, 연관관계 세팅과 관계 없음 부모, 자식 엔티티와 연관관계 주인(외래키 관리자)는 다름 Entity의 상태 Transient : JPA가 모르는 상태 (단순 객체 생성) Persistent : JPA가 관리중인 상태 (1차 캐시, Dirty Checking, Writ..
[JPA 프로그래밍 기본기 다지기] 양방향 매핑 노트 2021-05-29글 양방향 매핑 반대방향으로도 그래프 조회가 가능해야함 연관 관계의 주인과 왜 mappedBy를 해주는 건지? 객체는 서로를 포함하고 있어야 함 (2개가 필요) 객체와 테이블이 관계를 맺는 차이 객체 연관관계 회원 -> 팀 연관 관계 1개 (단방향) 팀 -> 회원 연관관계 1개 (단방향) 테이블 연관관계 회원 팀의 연관관계 1개 (양방향) 이 차이를 어떻게 극복할거냐?? 객체의 양방향 관계 객체는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개이다. 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 함 테이블의 양방향 관계 테이블은 외래키 하나로 두테이블의 연관 관계를 관리 둘 중 하나로 외래키를 관리해야 한다 객체는 두 곳에서 연관관계에 있는 객체를 다루고 있음 그러..
스프링 부트 Profile별로 다른 환경 구성 2021-06-09글 Profile? 애플리케이션 일부 configuration을 분리하고 싶을 때 사용 애플리케이션 일부 configuration을 특정 환경에서만 가능하게 하고 싶을 때 사용 개발 환경에 따라 설정값을 달르게 로딩할 때 @Profile @Component, @Configuration, @ConfigurationProperties을 @Profile와 함께 선언 @Configuration @Profile("production") public class ProductionConfiguration { // ... } 어플리케이션 실행시 spring.profiles.active 프로퍼티로 프로파일을 지정하면 해당 프로파일일 경우에만 해당 빈이 등록됨 application-properties s..