본문 바로가기
카테고리 없음

230207 TIL

by hbIncoding 2023. 2. 8.

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 : 트랜잭션을 읽기 전용으로 설정
  • @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