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 처리를 할 수 있음.
Cookie 아래와 같은 여러 설정 값들의 의미, 왜 써야 하는 건가
-
웹 브라우저는 요청 헤더에 쿠키를 저장해서 보낸다.
-
set-cookie 를 통해 이름, 유효기간, path 등의 설정 값들을 지정해줘야 쿠키가 의도대로 동작할 수 있다.
ResponseCookie cookie = ResponseCookie.from("SESSION", accessToken)
.domain("localhost")
.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 어떻게 설정하는가
CREATE INDEX index_이름 ON table_이름 (id);
CREATE INDEX index_이름 ON table_이름 (name);
CREATE INDEX index_이름 ON table_이름 (id, name);
- Cardinality가 높은, 즉 중복도가 낮은 컬럼일수록, 조회 활용도가 높을 수록, 수정 빈도가 낮을수록 index를 설정하기 좋은 컬럼이다.