1 ) 오늘 학습한 내용
- HttpMessageConverter
- Spring 내부 구조
- Converter, Formatter
- 1 : N 연관관계
- 1 : 1 연관관계
- N : M 연관관계
- 상속관계 매핑
- Proxy
- 지연로딩, 즉시로딩
- 영속성 전이
- JPA와 Transaction
- HttpMessageConverter
- 사용처
- HTTP 요청 : @RequestBody, @HttpEntity, @RequestEntity<>
- HTTP 응답 : @ResponseBody, @HttpEntity, @ResponseEntity<>
- 우선 순위
- byte[]
- String
- JSON
- 사용처
- Spring 내부 구조
- ArgumentResolver
- HTTP 요청이 컨트롤러 메소드에 전달될 때 각 파라미터를 알맞은 객체로 변환하는 인터페이스
- ReturnValueHandler
- 컨트롤러 메서드가 반환하는 값을 처리하여 HTTP 응답에 맞게 변환하는 인터페이스
- Converter, Formatter
- Converter
- 특정 타입을 다른 타입으로 변환할 때 사용하는 인터페이스
- Formatter
- 사용자 지정 포맷을 적용해 데이터 변환을 처리할 때 사용하는 인터페이스
- WebMvcConfigurer
- 설정을 통해 Converter, Formatter를 추가할 수 있다.
- ConversionService
- 어댑터 패턴
- Converter, Formatter 일관성 있게 사용할 수 있다.
- HttpMessageConverter
- ConversionService가 적용되지 않는다.
- 역할
- 요청 메시지 본문을객체로 변환
- 객체를 응답 본문에 입력하는 것
- JSON을 객체로 변환하는데 Jackson 라이브러리 사용
- Converter
- 스플링에서 제공하는 대부분의 기능은 인터페이스로 만들어져 있다.
- 기본적으로 제공하는 구현체들이 다양하다.
- 만약 확장하고자 하는 영역이 있다면 그 부분을 확장시켜 프로젝트에 적용하면 된다.
- 확장을 위해 반드시 내부 구조를 알아야한다.
- 연관 관계 설정 Annotation
- N : 1 : @ManyToOne
- 가장 많이 사용된다.
- 1 : N : @OneToMany
- 1 : 1 : @OneToOne
- N : N : @ManyToMany
- 조심해서 사용해야 한다.
- 단방향, 양방향
- 테이블 : 외래 키(FK) 하나로 모든 테이블 JOIN이 가능하다.
- 객체
- 외래 키가 있는 객체만 참조 가능하다.
- 단방향
- 참조용 필드가 양쪽에 있는 경우 양방향
- 단방향 두개로 이루어진 것이 양방향
- 외래 키가 있는 객체만 참조 가능하다.
- N : 1 : @ManyToOne
- 1 : N 연관관계
- 단뱡향
- 1의 Entity가 외래키를 관리한다.
- 1(Company)이 N(Tutor)의 외래 키를 수정해야한다.
- 단뱡향
- ...
- 양방향
- Tutor의 참조용 객체 Company는 읽기 전용 매핑이어야 한다.
- 만약, 양쪽에서 수정이 가능하면 예측이 불가능해진다.
- 1 : N 양방향 연관관계의 주인은 Company이다.
- 양방향
- 1 : 1 단뱡향
- 외래 키(FK)의 주인을 선택할 수 있다.
- 외래 키에 유니크 제약조건이 필요하다.
- 1 : 1 양방향
- N : 1 양방향 연관관계와 유사하다.
- 외래 키(FK)가 있는 곳이 연관관계 주인.
- 외래 키 위치 장단점
- 주 테이블
- 장점
- JPA로 객체 지향적인 개발이 가능해진다.
- 주 테이블만 조회해도 대상 테이블을 조회할 수 있다.
- 단점
- 대상 테이블에 값이 없다면 null이 허용된다.
- 데이터 무결성을 지키지 못한다.
- 대상 테이블의 데이터를 참조하기 때문에 삭제될 때 외래 키 값을 처리하는 관리 필요
- 대상 테이블에 값이 없다면 null이 허용된다.
- 장점
- 대상 테이블
- 장점
- 데이터베이스 무결성 보장
- 주 테이블과 대상 테이블의 연관관계 변경 시 테이블 구조가 유지된다.
- 단점
- 조회 성능이 떨어진다.
- 연관관계 매핑 설정이 복잡하다.
- 지연 로딩으로 설정해도 즉시 로딩된다.(중요)
- 장점
- 주 테이블
- N : M 연관관계
- 문제가 있어 잘 사용하지 않는다.
- 실제 설계에 추가적인 데이터 필요.
- 중간 테이블이 숨겨져 있어서 생각지 못한 SQL Query가 실행된다.
- 외래 키를 묶어서 PK로 설정된다.
- 문제 해결
- 중간 테이블을 실제로 Entity로 만들어서 관리한다.
- ManyToMany가 아닌 OneToMany, ManyToOne을 함께 사용한다.
- 문제가 있어 잘 사용하지 않는다.
- 상속관계 매핑
- 조인 전략
- 각각을 테이블로 만든다.
- DTYPE으로 어떤 테이블 인지 구분한다.
- 단일 테이블 전략
- 하나의 테이블로 만든다.
- DTYPE으로 어떤 테이블 인지 구분한다.
- 구현 클래스
- 구현 클래스 각각을 테이블로 만든다.
- JPA 단일 테이블 전략은 기본으로 DTYPE 컬럼이 생성된다.
- 조인 전략
- Proxy
- Proxy 객체
- 데이터베이스 조회를 지연하는 가짜(Proxy) 객체를 조회한다.
- 실제 Entity와 비교 실패, instanceof 사용
- target : 진짜 객체의 참조를 보관한다.
- 실제 클래스를 상속 받아서 만들어진다.
- 특징
- 최초로 사용할 때 한 번만 초기화된다.
- 프록시 객체를 통해 실제 Entity에 접근할 수 있다.
- Proxy 객체
- 지연로딩, 즉시로딩
- Lazy Loading (지연로딩)
- 데이터를 실제로 사용할 때 데이터베이스에서 조회하는 방식
- 지연로딩을 사용하면 proxy 객체를 조회한다.
- 연관된 객체를 매번 함께 조회하는 것은 낭비인 경우에 사용.
- Eager Loading (즉시로딩)
- Entity를 조회할 때 연관된 데이터까지 모두 한 번에 로드하는 방식
- Proxy 객체를 조회하지 않고 한 번에 연관된 객체까지 조회
- 매번 함께 조회하는 것이 효율적인 경우에 사용
- 즉시 로딩은 꼭 필요한 경우일 때만 사용.
- Lazy Loading (지연로딩)
- 영속성 전이
- Cascode
- JPA에서 특정 엔티티를 저장, 삭제 등의 작업을 할 때 연관된 엔티티에도 동일한 작업을 자동으로 적용하도록 설정하는 기능이다.
- 지연로딩과 즉시 로딩과 아무 관련 없다.
- 단일 Entity에 완전히 종속적인 경우 생명주기가 같다면 사용
- EX) 축구팀이 사라져도 축구장은 그대로 보존된다. (이런 경우 사용 X)
- 고아 객체
- JPA에서 부모 엔티티와의 연관관계가 끊어진 자식 엔티티를 뜻함.
- Cascode
- 트랜잭션 전파
- 트랜잭션이 여러 계층 또는 메서드에서 어떻게 처리될지 정의한다.
- propagation 속성을 통해 트랜잭션의 동작 방식을 제어할 수 있다.
- 다양한 비지니스 요구 사항에 맞게 복잡한 트랜잭션 흐름을 유연하게 설계할 수 있도록 돕는다.
- 데이터 무결성과 비지니스 로직의 안정성을 보장할 수 있다.
'TIL > Spring' 카테고리의 다른 글
TIL 2024-12-10 ( 2-3주차 - 데이터베이스 다루기 ) (0) | 2024.12.10 |
---|---|
TIL 2024-11-27 (Spring 심화 - 활용) (1) | 2024.11.27 |
TIL 2024-11-18 (Cookie/Session) (0) | 2024.11.18 |
TIL 2024-11-13 (Spring 숙련 - 2주차) (1) | 2024.11.13 |
TIL 2024-11-12 (Spring 숙련 - 1주차) (0) | 2024.11.12 |