BACK 94

[Spring] AOP를 이용한 Request 로깅

AOP(Aspect-Oriented Programming)를 이용하여 HTTP 요청과 응답을 로깅했습니다. package contest.collectingbox.global.config;import jakarta.servlet.http.HttpServletRequest;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Comp..

BACK/SPRING 2024.05.05

[Spring] @ExceptionHandler를 사용해 예외 처리하기

스프링은 API 예외 처리 문제를 해결하기 위해 @ExceptionHandler를 사용한 편리한 예외 처리 기능을 제공한다. 다음은 진행하고 있는 프로젝트에 @ExceptionHandler를 적용한 코드이다. @Getter @AllArgsConstructor public enum ErrorCode { // 400 NOT_SELECTED_TAG(BAD_REQUEST, "수거함 태그는 반드시 한 개 이상 설정해야 합니다."); // 404 // 409 // 500 private final HttpStatus httpStatus; private final String message; } enum 클래스를 만들어 상태 코드와 메세지를 담은 열거형을 정의한다. @Getter public class Collecti..

BACK/SPRING 2024.04.18

[JPA] TIL 11일차 - 객체지향 쿼리 언어 JPQL 기본 문법

기본 문법과 쿼리 API TypedQuery, Query Member member = new Member(); member.setUsername("member1"); member.setAge(10); em.persist(member); TypedQuery query1 = em.createQuery("select m from Member m", Member.class); TypedQuery query2 = em.createQuery("select m.username from Member m", String.class); Query query3 = em.createQuery("select m.username, m.age from Member m"); // 타입 정보를 받을 수 없을 때 결과 조회 API Me..

BACK/JPA 2024.04.08

[JPA] TIL 10일차 JPQL -중급 문법 (경로 표현식, 패치 조인, Named 쿼리, 벌크 연산)

경로 표현식 .을 찍어 객체 그래프를 탐색하는 것  상태 필드: 경로 탐색의 끝, 탐색 X String query = "select m.username from Member m"; // m.username까지가 탐색의 끝 단일 값 연관 경로: 묵시적 내부 조인(inner join) 발생, 탐색 O String query = "select m.team.name from Member m"; m.team을 했을 때 join 쿼리가 나간다. 실제 실무에서는 묵시적 내부 조인을 쓰면 안된다. 컬렉션 값 연관 경로: 묵시적 내부 조인 발생, 탐색 X String query = "select t.members from Team t"; // members 이후에 탐색 불가능하다.컬렉션 자체를 가리키기 때문이다.siz..

BACK/JPA 2024.04.07

[JPA] TIL 9일차 - JPA 의 다양한 쿼리 방법(JPQL, JPA Criteria, QueryDSL 등)

JPA는 다양한 쿼리 방법(JPQL, JPA Criteria, QueryDSL...)을 지원한다. 대부분 jpql로 해결이 되지만, 어쩌다 안될 경우에는 네이티브 SQL이나 MyBatis, SpringJdbcTemplate를 쓰면 된다. JPQL 소개 JPA를 사용하면 엔티티 객체를 중심으로 개발하게 되고, 검색할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 이 때 모든 데이터베이스를 메모리에 올려 객체로 변환해 검색하는것은 말이 안된다. 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 있는 SQL이 필요하다. 이런 문제를 해결하기 위해 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. SQL은 DB 테이블을 대상으로 쿼리하는 반면, JPQL은 엔티티..

BACK/JPA 2024.04.05

[JPA] TIL 8일차 : JPA 고급 매핑 - 상속 관계 매핑

관계형 데이터베이스는 상속 관계가 없다. 대신 슈퍼타입 서브타입이라는 모델링 기법이 객체 상속과 유사하다. 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑해 상속관계를 매핑한다. 슈퍼 타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 - 각각 테이블로 변환 : 조인 전략 - 통합 테이블로 변환 : 단일 테이블 전략 - 서브타입 테이블로 변환: 구현 클래스마다 테이블 전략 조인 전략 필요한 테이블을 조인해 가져옴 @Inheritance(strategy = InheritanceType.JOINED) @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn // dtype 컬럼이 생기고 기본 값으로는 엔티티 명..

BACK/JPA 2024.04.04

[JPA] TIL 7일차 - JPA 다양한 연관관계 매핑

연관관계 매핑시 고려사항 3가지 다중성 다대일 @ManyToOne 일대다 @OneToMany 일대일 @OneToOne 다대다 @ManyToMany: 실무에서 쓰면 안됨 단방향, 양방향 테이블: 외래 키 하나로 양쪽 조인이 가능해 방향의 개념이 없다. 객체: 참조용 필드가 있는 쪽으로만 참조가 가능하다. 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향(단방향이 두개) 양방향 시 연관관계의 주인 연관관계의 주인: 외래 키를 관리하는 참조 주인의 반대편: 외래 키에 영향을 주지 않고 단순 조회만 가능 객체 양방향 관계는 참조가 두군데 있고, 둘 중 테이블의 외래키를 관리할 곳을 지정해야 한다. 다대일 다대일 단방향 관계형 DB는 다쪽에 외래키가 항상 있어야 한다. 외래키가 있는 객체에 참조를 넣어 주고 ..

BACK/JPA 2024.04.03

[JPA] JPA의 값 타입 (기본 값, 임베디드, 컬렉션 타입)

JPA의 데이터 타입 분류 엔티티 타입 데이터가 변해도 식별자로 지속해서 추적 가능 ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 @Entity로 정의하는 객체 값 타입 int, Integer, String 처럼 값으로 사용하는 자바 기본 타입이나 객체 식별자 없고 값만 있어 변경 시 추적 불가 ex) 숫자 100 -> 200 변경 시 완전히 다른 값으로 대체 값 타입 분류 기본 값 타입, 임베디드 타입, 컬렉션 타입으로 나눌 수 있다. 기본값 타입 엔티티에 생명 주기를 의존한다 (회원 엔티티를 삭제하면 필드도 함께 삭제) 값 타입은 공유하면 안된다 (회원 이름 변경시 다른 회원 이름이 변경되면 안됨) 자바의 기본 값은 항상 값을 복사한다. Integer같은 래퍼 클래스나 String..

BACK/JPA 2024.04.02

[JPA] JPA 즉시 로딩과 지연 로딩, 영속성 전이와 고아 객체

즉시 로딩과 지연 로딩 다대일 연관관계가 있는 멤버와 팀이 있을 때, 단순히 멤버 정보만 사용하는 비즈니스 로직이라서 멤버를 조회할 때 팀이 조회가 안되어도 된다고 가정하자. 이런 경우에는 지연 로딩을 쓸 수 있다. 지연 로딩 ⇒ 연관된 것을 proxy로 가져오고, 연관된 것의 실제 값을 사용하는 시점에 실제 쿼리가 나감 ex) 멤버를 사용할 땐 팀은 proxy로 가져오고, 팀의 실제 값을 사용할 때 DB에서 가져옴 Member @ManyToOne(fetch = FetchType.LAZY) // proxy 객체로 조회한다. @JoinColumn private Team team; Member 클래스만 DB에서 조회한다. Team team = new Team(); team.setName("teamA"); e..

BACK/JPA 2024.04.02

[JPA] JPA 프록시의 특징

프록시 JPA는 em.find() 말고도 참조를 가져오는 em.getReference() 라는 메소드가 있다. em.find() : 데이터베이스를 통해 실제 엔티티 객체를 바로 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 (DB쿼리 안나감) Member member = new Member(); member.setUsername("hello"); em.persist(member); em.flush(); em.clear(); Member findMember = em.find(Member.class, member.getId()); System.out.println("findMember.getUsername() = " + findMember.getUserna..

BACK/JPA 2024.04.02