Spring 입문 주차 3일차
0. 용어 정리 복습
1)@어노테이션 정리
- @Component : 관리되는 객체임을 표시 하기 위한 가장 기본적인 annotation, 하위 어노테이션들 대신 사용할 수 있지만 역할을 명확하게 구분지어 주기 위해 각각 알맞게 사용한다.
- @Controller : Web MVC 코드에 사용되는 annotation, 해당 클래스가 controller임을 명시
- @Service : 비즈니스 로직이나 repository layer 호출하는 함수에 사용
- @Repository : 해당 클래스가 Repository임을 명시
- @Controller : 주로 view를 반환하기 위해 사용, @ResponseBody와 같이 사용하면 RestContoller와 똑같은 기능 수행
- @RestController : 주로 Json/XML 형태로 객체 데이터 반환을 한다.
- @Data : 하위 어노테이션 합체본, 자동으로 하위 어노테이션의 기능을 수행해준다
- @Getter : 객체의 변수를 반환한다. 데이터 보호를 위해 사용하며 특히 클래스 생성시 사용
- @Setter: 파라미터를 받아서 변수에 할당한다. 데이터 보호를 위해 사용하며 특히 클래스 생성시 사용
- @NoArgsConstructor : 파라미터가 없는 기본 생성자를 생성
- @AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 생성
- @RequiredArgsConstuctor : final이나 @NonNull인 필드 값만 파라미터로 받는 생성자 생성
- @EqualsAndHashCode : 자바 빈을 만들 때 equals와 hashCode를 자주 오버라이딩 하는데 이걸 자동으로 해줌
- @ToString : toString() 메서드를 자동으로 실행 및 생성
- @PathVariable : URL의 마지막 변수를 처리해준다 ex)api/user/123
- @RequestQuery : 엔드포인트의 ? 뒤에 등장하며 변수를 담는다, key=value로 이루어져있고 &로 이어짐. ex)/api/member?days=3&unit=metric&time=10
- @RequestParam : 주소에 포함된 변수를 담는다 ex)/arp/member?id=2
- @RequestBody: URL에는 보이지 않는 오브젝트 데이터(XML, JSON, MultiForm)를 담는다
- @GeneratedValue(stratege = generationType.???) : PK(primary key)값이 어떻게 들어갈 지 결정해준다.
- AUTO : DB방언 종류에 따라 자동으로 전략을 선택 (default)
- IDENTITY : 데이터베이스에 위임
- SEQUENCE : 들어오는 순서대로 생성
- @Transactional(4가지 기능과 Option 6가지) : 범위내 메서드가 트랜잭션이 되도록 보장
- 4가지 특징
- 원자성(Atomicity) : 한 트랜잭션 내 실행한 작업들은 하나의 단위로 처리, 즉 모두 실패 또는 성공
- 일관성(Consistency) : 일관성있는 데이터베이스 상태를 유지한다.
- 격리성(Isolation) : 동시에 실행되는 트랜잭션들은 서로 영향을 미치지 않도록 해야한다.
- 영속성(Durability) : 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다.
- 6가지 옵션
- isolation : 트랜잭션에서 일관성 없는 데이터 허용 수준을 설정
- propagation : 트랜잭션 동작 도중 다른 트랜잭션을 호출시 어떻게 할것인 지 설정
- noRollbackFor : 특정 예외 발생 시 rollback하지 않는다.
- RollbackFor : 특정 예외 발생 시 rollback한다.
- timeout : 지정시간 내 메소드를 수행하지 않으면 rollback(-1이면 timeout 미사용)
- readOnly : 트랜잭션을 읽기 전용으로 설정
- 4가지 특징
- @Enumerated 과 Enum
- Enum : 서로 연관된 상수의 집합, 여기선 int 나 String이 아닌 그 자체 정렬 및 관리 기준이라고 할 수 있다. 예를 들면 영화 등급을 UNRATED,G,PG,PG13,R,NC17 등으로 분류하는 것과 같다.
- @Enumerated : 엔티티 클래스 속성 중 Enum 타입 변수에 사용한다.
- EnumType.STRING : 각 Enum 이름을 컬럼에 저장한다. ex) G, PG, PG13..
- EnumType.ORDINAL : 각 Enum에 대응되는 순서를 칼럼에 저장한다. ex) 0, 1, 2..
public enum Rating {
UNRATED,
G,
PG,
PG13,
R,
NC17
}
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Movie {
@Id
@GeneratedValue
private int id;
@Column
private String director;
@Column
private String title;
@Column
private int year;
@Enumerated(EnumType.STRING)
private Rating rating;
}
- Inner class(내부 클래스) : 클래스 내부에 클래스를 선언하는 것.
- 장점 : 클래스 선언 파일을 줄이고 한 곳에 모아서 관리 가능
- 단점 : 참조값을 담아야 하기 때문에, 인스턴스 생성 시 시간적,공간적으로 성능이 낮아짐
- 단점2 : 외부 instance에 대한 참조가 존재 해, 가비지 컬렉션이 인스턴스 수서를 못해 메모리 누수가 생길 수 있음
- 1차 캐시 : 영속성 컨텍스트 내부에는 엔티티를 보관하는 저장소가 있는데 이를 1차 캐시라 한다. 트랜잭션을 시작하고 종료할 때 까지만 유효하며, OSIV를 사용하더라도 사용자의 요청이 들어오고 끝날 때 까지만 유효하다
- 특징 : 같은 엔티티가 있으면 객체 동일성을 보장한다.
- 2차 캐시 : 어플리케이션의 범위 캐시로, 공유 캐시라고도 하며 어플리케이션 종료까지 유지된다.
- 특징 : 동시성 극대화를 위해 캐시 한 객체를 직접 반환하지 않고 복사본을 만들어서 사용
- 연속성 콘텍스트 : 엔티티를 영구 저장하는 환경, 애플리케이션과 DB사이에서 객체를 보관하는 가상의 DB같은 역할
- 더티 체킹 : 변경된 부분을 체크해서 DB에 반영한다는 뜻
예시 : findbyid 로 값을 가져온 뒤 영속을 시켜둔 상태에서 필요시마다 save 메서드를 날리면서 id 값 기준으로 동일한 값이 있는지 체킹하고 있다면 update 없다면 insert 를 날려주는 방식이다. 하지만 그렇게 되면 매번 쿼리를 날릴때마다 select insert / select update 를 날리게 된다. 불필요한 데이터베이스 체킹이 한번씩 더날라간다. 이럴 경우를 방지하려면 더티체킹이 되야한다. 간단하게 말하면 디비에 왔다갔다 하는 방법을 맨 처음 영속할때 한번, 그리고 모든 프로세스가 종료될때 한번 이렇게 두번만 하려고 하는것이다.
2. 참고 자료
1)restful API 설계 https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
2)H2 쿼리 문법을 MySQL 쿼리문법으로 변경하여 로그 출력하기
https://smpark1020.tistory.com/158
3)GeneratedValue의 각 기능들과 장단점
https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html
4)@transactional 기능 알고 쓰기
https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h
5)Enum : 간단 설명과 예시
https://velog.io/@shinmj1207/JPA-Enumerated
6)inner 클래스의 단점과 차이
https://yuja-kong.tistory.com/entry/Java-inner-class-%EC%99%80-inner-static-class-%EC%B0%A8%EC%9D%B4
7)1차 캐시와 2차 캐시
https://willseungh0.tistory.com/77
8)더티 체크
https://thenicesj.tistory.com/411
https://interconnection.tistory.com/121