블로그 프로젝트 - JPA 제공 기능과 Stream, 디자인 패턴에 대하여

최민수·2023년 2월 22일
0

[개발] Java Spring

목록 보기
2/18

PK 생성 전략 종류에 관하여

  • 기본키 매핑은 @Id 로.

  • 기본키 자동생성 전략에는 4가지가 있음.

    • IDENTITY: 기본키 생성을 데이터베이스에 위임하는 전략.
      • id 값을 null로 해두면 알아서 AUTO_INCREMENT 해준다.
      • JPA는 보통 트랜잭션 commit 시점에서 INSERT 쿼리를 날리는데, 이렇게 되면 트랜잭션 안에 기본키 값을 참조하는 로직이 있거나 영속성 객체를 만들 때 문제가 생긴다.
      • 그렇기 때문에 IDENTITY 전략은 예외적으로 em.persist 시점에서 바로 INSERT 쿼리를 날리고 그때 id 값을 세팅한다.
    • SEQUENCE: id 값을 null로 해두고 generator에 매핑된 Sequence Object에서 id 값을 얻어오는 전략.
      • DB Sequence Object: 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
      • em.persist 전에 sequence를 매번 DB 에서 가지고 온다.
    • TABLE: 키 생성 전용 테이블을 하나 만들어서 Sequence전략을 흉내내는 전략.
      • 모든 데이터베이스에 적용 가능하지만 최적화 되어있지 않은 테이블을 직접 사용하기 때문에 성능상의 이슈가 있다.
    • AUTO: 데이터베이스마다 사용하는 dialect에 따라 위 세가지 전략 중 한가지를 자동으로 지정하는 전략.

Repository Interface가 JpaRepository 를 상속하면 저장소 역할을 할 수 있게 되는 것인가

  • Interface repo → extends (상속) → Jpa repo
  • Interface repo → extends (상속) → Crud repo 의 상속 구조임.
  • 따라서 생성한 interface repo는 상속하는 Jpa reop나 Crud repo에 있는 메소드를 당연히 사용가능 (findAll(), save(), findById() 등..)

JPA Lob annotation

  • @Lob 자바에서는 String 타입으로, DB로 저장될 때는 Long text의 large object 로 필드의 값이 관리되도록 하는 어노테이션.

ControllerTest 에서 MockMvc 사용하는 방법

@AutoConfigureMockMvc, mockMvc.perform(...)

  • 스프링 테스트 프레임워크로, RestController에서 통합 테스트를 수행할 때 사용함.

  • @AutoConfigureMockMvc 어노테이션을 클래스 위에 달면 mock 테스트가 가능하다.

  • @Autowired private MockMvc mvc; 이런 식으로 주입받는다.

  • 사용 예시:

    mockMvc.perform(post("/posts")
                    .contentType(APPLICATION_JSON)
                    .content(json)
            )
            .andExpect(status().isBadRequest())
            .andDo(print());

ObjectMapper?

(실무에서 많이 사용한다고 들음)

  • JSON 객체를 Java 객체로, Java 객체를 JSON 객체로 변환시켜주는 Jackson 라이브러리의 클래스이다.
  • Java Object → JSON : writeValue() 사용
    - Ex) objectMapper.writeValue(new File("src/person.json"), person);
  • JSON → Java Object : readValue() 사용
    - Ex) Person deserializedPerson = objectMapper.readValue(json, Person.class);

Builder 패턴?

  • 빌더 패턴은 복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여, 동일한 생성 절차에서 서로 다른 표현을 생성하는 방법을 제공하는 디자인 패턴.

  • 즉, 객체를 생성하는 방법엔 일반적으로
    1. Constructor 에 인수를 넣어 생성하는 방법.
    2. 생성후 필드에 setter로 주입하는 방법.
    3. 값 세팅 후 마지막에 build() 를 호출하는 빌더 패턴으로 생성하는 방법.

  • Ex)

    PostCreate request = PostCreate.builder()
            .title("제목입니다")
            .content("글 내용입니다 하하")
            .build();
  • 빌더의 장점
    - 객체의 불변성
    - 객체 생성이 되는 순간 setting을 모두 하기 때문.
    - 또, 객체 생성 시 파라미터 값의 순서를 바꿔 의도하지 않은 객체가 나올 수 있는 가능성을 차단할 수도 있음.
    - 가독성에 좋다 (복잡한 객체의 값 생성을 세밀하고 유연하게 할 수 있음)


생성자 오버로딩이 가능한 조건?

  • 생성자도 메서드의 일종이기 때문에 메서드 오버로딩과 조건이 같다.
    - 즉, 메서드의 이름이 같아야 하며 매개변수의 개수 또는 타입이 달라야 한다.
  • 주의할 점)
    - 생성자 오버로딩 된 경우는 기본 생성자를 제공하지 않기 때문에 기본 생성자를 적어주는 습관을 가지는 경우가 좋다고 함. 기본 생성자

sql 문법 → limit, offset 사용법

SELECT 
    employee_id, first_name, last_name
FROM
    employees
ORDER BY first_name
LIMIT 5 OFFSET 3;
  • limit 5: 데이터 5개만 가져오기.
  • offset 3: index 3(4번째 데이터) 부터 시작.

스트림(Stream) 이란?

  • 배열이나 컬렉션에 대해 요소들을 하나씩 참조하면서 반복적인 처리를 도와주는 기능.
  • for문이나 분기처리를 깔끔하게 해줘서 직관적인 코드를 쓸 수 있게 해줌.
  • IntStream 은?
    • 자바8에 추가된 IntStream은 int를 스트림으로 다룰수 있도록 해주는 스트림 api 임.
    • 생성: IntStream.range(1,5);
    • filter 함수: IntStream.range(1,5).filter(i -> i % 2 == 1) // result: 1, 3

Pageable 사용법

(페이징 처리 abstract interface)

  • 참고: https://tecoble.techcourse.co.kr/post/2021-08-15-pageable/
  • Pagination: 게시판에 많은 글들이 있을 때, 페이지를 나눠 글들을 보여주는 것처럼 페이지 크기, 몇 번째 페이지인지 요청에 따라 정보를 전달해주는 것.
  • JPA에서 pagination을 편하게 쓸 수 있도록 Pageable 이라는 객체를 제공해주는 것임.
    • public List<PostResponse> getList(Pageable pageable) {...}
      • 위와 같은 방식으로 Pageable 객체를 인수로 넘겨주는 식으로 사용할 수 있음.
    • mockMvc.perform(*get*("/posts?page=1&size=10")
      • Controller 에서 위와 같은 요청이 들어오게 되면 page=1&size=10 에 해당하는 Pageable 객체를 자동으로 만들어 주기 때문에 편리하게 pagination 처리를 할 수 있음.

  • 웹 브라우저는 요청 헤더에 쿠키를 저장해서 보낸다.

  • set-cookie 를 통해 이름, 유효기간, path 등의 설정 값들을 지정해줘야 쿠키가 의도대로 동작할 수 있다.

    ResponseCookie cookie = ResponseCookie.from("SESSION", accessToken)
            .domain("localhost") //todo 서버 환경에 따른 분리 필요
    .path("/")
            .httpOnly(true)
            .secure(false)
            .maxAge(Duration.ofDays(30))
            .sameSite("Strict")
            .build();
    • domain: 쿠키를 표현할 도메인 설정
    • httpOnly: true일 경우 쿠키의 범위를 HTTP 요청으로 제한
      - True로 설정해야 하는 이유: 보안
      Client-side 접근을 막을 수 있다. 만약 False로 설정하면 클라이언트 스크립트(JS 개발자 도구) 에서 값을 수정할 여지가 생긴다.
    • sameSite: 쿠키를 동일 사이트 컨텍스트로 제한해야 하는지 여부를 선언할 수 있다.
      - SameSite를 Strict으로 설정하면 쿠키가 자사 컨텍스트에서만 전송된다.
      즉, 사용자 측면에서 쿠키는 해당 사이트가 현재 브라우저의 URL 표시줄에 표시된 사이트와 일치하는 경우에만 전송됨.
    • secure: 쿠키의 범위를 보안 채널로 제한하는 속성
    • maxAge: 쿠키 유효 시간(초) 설정. 0일 경우 쿠키 제거
    • path: 쿠키 경로 지정
    • value: 쿠키 값 설정
    • version: 이 쿠키가 준수하는 쿠키 프로토콜 버전 설정

sql 문법으로 DB index 어떻게 설정하는가

-- single column index for id
CREATE INDEX index_이름 ON table_이름 (id);
-- single column index for name
CREATE INDEX index_이름 ON table_이름 (name);
-- multi column index for id, name
CREATE INDEX index_이름 ON table_이름 (id, name);
  • Cardinality가 높은, 즉 중복도가 낮은 컬럼일수록, 조회 활용도가 높을 수록, 수정 빈도가 낮을수록 index를 설정하기 좋은 컬럼이다.
profile
CS, 개발 공부기록 🌱

0개의 댓글