legacy
-
[JPA] OSIV(Open Session In View) 정리legacy/JPA 2024. 4. 7. 21:42
OSIV(Open Session In View)란? JPA 하면 떠오르는 것이 영속성 컨텍스트입니다. 영속성 컨텍스트란 DB로부터 조회한 엔티티를 관리하는 저장소라고 생각하면 됩니다. 트랜잭션이 시작되어 조회된 엔티티는 영속성 컨텍스트(1차 캐시)에 저장하여 트랜잭션이 종료될 때까지 사용됩니다. 스프링을 사용한다면 기본적으로 OSIV가 켜진 상태로 사용됩니다. OSIV는 영속성 컨텍스트와 관련이 있는데 이에 대해서 알아보겠습니다. OSIV = true 먼저 사용자의 요청이 들어오면 이것을 처리하기 위해서 트랜잭션이 시작됩니다. 각 트랜잭션마다 영속성 컨텍스트가 생성되고, 트랜잭션이 살아있는 동안 영속성 컨텍스트가 살아있다는 의미가 됩니다. 영속성 컨텍스트가 살아있다면 엔티티의 조회 및 수정을 진행할 수..
-
[JPA] 다른 Transaction에서 조회한 엔티티 비교legacy/JPA 2024. 4. 7. 16:17
Entity 조회 Service 레이어에서 DB에 접근할 때 Transaction 단위로 수행됩니다. 예를 들어, Member 테이블에 id 값이 1인 엔티티가 존재합니다. 해당 엔티티를 조회하기 위해서는 Transaction 단위로 조회해야 합니다. DB에서 엔티티를 조회하기 위해 MemberService를 정의합니다. MemberRepository를 의존성 주입을 받아 사용합니다. @Service public class MemberService { @Autowired MemberRepository memberRepository; @Transactional(readOnly = true) public Member findMember(Long id) { return memberRepository.findB..
-
[Spring] GitHub Actions의 CI 문제, 그리고 AWS Secrets Managerlegacy/Spring 2024. 4. 3. 14:22
AWS Secrets Manager를 사용하게 된 계기 현재 진행 중인 프로젝트에서 커밋 한 코드를 깃헙에 PR 올렸을 때 발생하는 CI(Continuous Integration) 문제 해결법에 대해서 알아보겠다. 우리 프로젝트의 경우 PR에 올라간 커밋한 내용들에 빌드가 정상적으로 수행되는지 GitHub Actions에서 검사한다. 분명 로컬에서 작업했을 때 빌드에 문제도 없었고, 테스트 코드 또한 정상적으로 모두 수행되었다. 그래서 당연히 PR 올렸을 때도 문제가 없을 줄 알았다. 그러나 아래를 보면 X 표시가 보일 것이다. X의 의미는 내가 올린 코드가 빌드에 문제가 생겼다는 의미이다. 왜 문제가 발생했을까? 이유는 간단하다. .gitignore에 추가된 파일이 깃헙에 올라가지 않기 때문이다. Gi..
-
[JPA] Spring Data JPA Repository -> 사용자 정의 Repositorylegacy/JPA 2024. 3. 30. 12:04
Spring Data JPA 기존에 Spring Data JPA가 제공하는 JpaRepository를 상속받았고, 그곳에 사용자 요청을 처리하는 코드들이 담겨있었다. 기존 코드들을 확인해 보자. Service JPAQueryFactory를 의존받아 사용하고 있다. Querydsl로 작성한 쿼리문이 service 레이어에 포함되어 있다. 참고로 select() 절에 QGetSectionResponseDto는 @QueryProjection을 통해 dto로 변환하여 클라이언트로 전달하고자 사용하였다. 서비스 레이어에 쿼리문이 포함되어 있으니 코드 가독성이 좋지 않아 보인다. @Service @RequiredArgsConstructor public class SectionService { private fina..
-
[Spring] @Valid 검증 실패 시에 default message 출력하기legacy/Spring 2024. 3. 26. 23:11
@Valid Controller로 넘어오는 데이터를 검증하는 데 사용할 수 있다. 예를 들어, API를 호출할 때 user의 id를 반드시 전달해야 할 경우 @NotNull(message = "사용자의 id는 필수 정보입니다.")와 같이 검증 조건을 추가할 수 있다. @Getter public class FindSectionCountRequestDto { @NotNull(message = "회고 보드 ID는 필수 입력 값입니다.") private Long retrospectiveId; @NotNull(message = "템플릿 섹션 ID는 필수 입력 값입니다.") private Long templateSectionId; } Controller에서 API를 호출할 때 위에서 정의한 dto를 받는다. 위에서..
-
[JPA] Cascade 옵션을 사용하여 무결성 문제를 해결해보자legacy/JPA 2024. 3. 18. 03:22
Cascade란 Cascade란 영속성 전이를 의미한다. 엔티티A에 작업한 내용이 이를 참조하는 엔티티B까지 영향이 전이된다. Cascade에는 여러가지 옵션이 존재한다. ALL // 모두 적용 PERSIST // 영속 REMOVE // 삭제 MERGE // 병합 REFRESH DETACH 위 옵션 중에서 REMOVE에 대해서 알아보겠다. Cascade.REMOVE는 엔티티A를 삭제하면 이를 참조하는 엔티티B도 같이 삭제된다. ex. 부모 엔티티를 삭제하면 모든 자식 엔티티도 같이 삭제된다. 이부분은 사실 직접 경험하지 않는 이상 감이 와닿지 않는다. 나 또한 cascade란 옵션이 있구나? 에서 그쳤었는데, 이번에 무결성 문제가 발생하면서 cascade를 사용해야겠다고 다짐했다. Cascade.REMO..