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
[Network] REST란? REST API란? RESTful이란? - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
2)H2 쿼리 문법을 MySQL 쿼리문법으로 변경하여 로그 출력하기
https://smpark1020.tistory.com/158
H2 쿼리 문법을 MySQL 쿼리 문법으로 변경하여 로그 출력하기
아무 설정도 하지 않은 상태에서의 테이블 생성 쿼리 로그를 보면 H2 문법이 적용되어 있다. create table car ( car_id bigint generated by default as identity, car_number varchar(255), category varchar(255), color varchar(255),
smpark1020.tistory.com
3)GeneratedValue의 각 기능들과 장단점
https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html
[JPA] 기본키(PK) 매핑 방법 및 생성 전략 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
4)@transactional 기능 알고 쓰기
https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h
[Java]@Transactional Annotation 알고 쓰자
초반 @Transactional 어노테이션에 대해 자세히 알아보지 않고,막연히 롤백때 사용한다고 하여 SQL C,U,D 를 할 때마다 메소드 위에 붙여서 사용하곤 하였다.하지만, 내 코드를 보신 선임께서 단지 @Tran
velog.io
5)Enum : 간단 설명과 예시
https://velog.io/@shinmj1207/JPA-Enumerated
[JPA] @Enumerated
@Enumerated Spring Batch 예제를 짜다가 발견한 @Enumerated 어노테이션에 대해 기술하려한다. Enum 먼저 영화 등급을 나타내는 Rating Enum이 다음과 같이 있다고 해보자. Rating.java Movie.java 다음은 영화 d
velog.io
6)inner 클래스의 단점과 차이
https://yuja-kong.tistory.com/entry/Java-inner-class-%EC%99%80-inner-static-class-%EC%B0%A8%EC%9D%B4
[Java] inner class 와 inner static class 차이
들어가며 fastcampus 강의를 듣던 중 application layer 단의 DTO class를 만드는데 inner static class 로 request, response를 만들었다. 이전에 개발 시 dto 생성을 찾아보면서 따라해본 적있는 방법이지만 inner static
yuja-kong.tistory.com
7)1차 캐시와 2차 캐시
https://willseungh0.tistory.com/77
[JPA] 1차 캐시 vs 2차 캐시
JPA에 대해서 헷갈렸던 개념들을 위주로 정리하는 글입니다. 1차 캐시와 2차 캐시 네트워크를 통해 데이터베이스에 접근하는 시간 비용은 애플리케이션 서버 내부 메모리에 접근하는 시간보다
willseungh0.tistory.com
8)더티 체크
https://thenicesj.tistory.com/411
JPA 더티체킹(Dirty Checking) 이란?
JPA에 대해서는 아래 참고 포스팅을 참고하면 확인해볼수 있다. 이번 포스팅에서 다뤄볼 내용은 더티체킹이라는 개념이며 직역으로는 변경상태 감지 라고 느낄수 있다. JPA에서는 값을 데이터베
thenicesj.tistory.com
https://interconnection.tistory.com/121
JPA 더티 체킹(Dirty Checking)이란?
JPA(Java Persistence API)를 사용하면서 더티 체킹과 트랜잭션의 관계에 대해서 알고 있지 않으면, 비즈니스 로직에서 다루는 엔티티 데이터가 꼬이는 경우가 발생합니다. 데이터가 꼬이는 경우를 방
interconnection.tistory.com