221129 - API, lombok, JPA

Cornchip·2022년 11월 29일
0

Today-I-Learned

목록 보기
1/28

목차
1. API와 Endpoint
2. Lombok Library
3. JPA



1. API와 Endpoint

1) API

01. API는 프로그램들이 서로 상호작용하는 것을 도와주는 매개체 역할을 한다.

1) API는 서버와 데이터베이스에 대한 출입구 역할을 한다.
2) API는 애플리케이션과 기기가 원활하게 통신할 수 있도록 한다.
3) API는 모든 접속을 표준화한다.


02. 웹 API

1) 웹 API는 웹 애플리케이션 개발에서 다른 서비스에 요청을 보내고 응답을 받기 위해 정의된 명세를 일컫는다.
2) 말하자면 서비스 간의 요청과 응답을 위한 명세이다.




2) Endpoint

01. Endpoint

1) 서비스를 사용가능하도록 하는 서비스에서 제공하는 커뮤니케이션 채널의 한 쪽 끝.
2) 즉, 요청을 받아 응답을 제공하는 서비스를 사용할 수 있는 지점을 의미한다.


02. API vs Endpoint

1) API: 두 시스템이 상호작용할 수 있게 하는 프로토콜의 총집합.
2) Endpoint: API가 서버에서 리소스에 접근할 수 있도록 가능하게 하는 URL




2. Lombok library

1) @Data

  1. @Data Annotation은 @Getter @Setter @ToString @EqualsAndHashCode @RequiredArgsConstructor를 모두 합쳐놓은 어노테이션이다.

    1) @ToString
    exclude속성 : @ToString결과에서 제외시킬 수 있다.

    2) @EqualsAndHashCode
    callSuper속성 : equalshashCode 메서드 자동 생성 시 부모 클래스의 필드까지 감안할지 설정할 수 있다.

    • callSuper = true이면 부모 클래스 필드 값들도 동일한지 체크
    • callSuper = false이면(기본값) 자신 클래스의 필드 값들만 고려한다.
  2. POJO와 Bean과 관련된 모든 재사용 가능한 코드(=boilerplate)를 생성한다.
  3. @DatacallSuper, includeFieldName, exclude와 같은 파라미터와 같이 사용될 수 없으므로 해당 파라미터를 사용할 때는 개별 Annotation을 모두 명시해 주면 된다.

2) @NoArgsConstructor

파라미터가 없는 기본 생성자를 만들어 준다.

3) @AllArgsConstructor

모든 필드값을 파라미터로 받는 생성자를 만들어 준다.

4) @RequiredArgsConstructor

final이나 @NonNull인 필드값만 파라미터로 받는 생성자를 만들어 준다.




3. JPA

1) Basic

  • @Entity, @Table: 객체와 테이블을 매핑
  • @Id: 기본 키 매핑
  • @Column: 필드와 컬럼 매핑
  • @ManyToOne, @JoinColumn: 연관관계 매핑

2) @Entity

  • 테이블과의 매핑

  • @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불린다.

  • 속성

    Name: JPA에서 사용할 엔티티 이름을 지정한다.
    보통 기본값인 클래스 이름을 사용한다.

  • 주의사항

    기본생성자가 필수이다.(JPA가 엔티티 객체 생성 시 기본 생성자를 사용)
    final 클래스, enum, interface, inner class에는 사용할 수 없다.
    저장할 필드에 final 사용 불가


3) @Table

  • 엔티티와 매핑할 테이블을 지정

  • 생략 시 매핑한 엔티티 이름을 테이블 이름으로 사용

  • 속성

    Name: 매핑할 테이블 이름(기본값: 엔티티 이름 사용)
    CataLog: catalog 기능이 있는 DB에서 catalog를 매핑(기본값: DB명)
    Schema: schema 기능이 있는 DB에서 schema를 매핑
    uniqueConstraints: DDL 생성 시 유니크 제약조건을 만듦.
    스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용


4) 데이터베이스 스키마 자동 생성

  • JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원
  • 클래스의 매핑 정보와 데이터베이스 방언을 사용하여 데이터베이스 스키마 생성
  • 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성
  • 스키마 자동 생성 기능 사용을 위해 persistence.xml에 속성 추가
    <property name="hibernate.hbm2ddl.auto" value="create" />

    hibernate.hbm2ddl.auto속성

    • create: 기존 테이블을 삭제하고 새로 생성(DROP+CREATE)
    • create-drop: create속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거 (DROP+CREATE+DROP)
    • update: DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정
    • validate: DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않음. DDL을 수행하지 않음.
    • none: 자동 생성 기능을 사용하지 않음
  • 주의사항

    개발 초기 단계는 create또는 update
    초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI서버는 create 또는 create-drop
    테스트 서버는 update 또는 validate
    스테이징과 운영 서버는 validate 또는 none


5) 기본 키 매핑

  • 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들기 위해 식별자 값이 반드시 필요하다.

  • @GeneratedValue

    1. 기본 키 생성 전략
    • 직접 할당: 기본 키를 애플리케이션에 직접 할당

      em.persist()를 호출하기 전 애플리케이션에서 직접 식별자 값을 할당해야 함.
      식별자 값이 없을 경우 에러 발생

    • 자동 생성: 대리 키 사용 방식

      IDENTITY: 기본 키 생성을 데이터베이스에 위임 (=AUTO_INCREMENT)

      SEQUENCE: 데이터베이스 시퀀스를 사용해서 기본 키를 할당
      데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장
      유일한 값을 순서대로 생성(오라클, PostgreSQL, DB2, H2)

      TABLE: 키 생성 테이블을 사용
      키 생성 전용 테이블 하나를 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략.
      테이블을 사용하므로 모든 데이터베이스에 적용 가능

      AUTO: 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(기본값)
      ex) 오라클 DB 선택 시 SEQUENCE, MySQL DB 선택 시 IDENTITY 사용


6) @Column

  • 객체 필드를 테이블 컬럼에 매핑
  • 속성 중 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않음
  • 속성

    name: 필드와 매핑할 테이블 컬럼 이름 (기본값: 객체의 필드 이름)

    nullable(DDL): null 값의 허용 여부 설정, false 설정 시 not null (기본값: true)
    @Column 사용 시 nullable = false로 설정하는 것이 안전

    unique(DDL): @TableuniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 적용

    columnDefinition(DDL): 데이터베이스 컬럼 정보를 직접 줄 수 있음, default 값 설정
    (기본값: 필드의 자바 타입과 방언 정보를 사용해 적절한 컬럼 타입을 생성)

    Length(DDL): 문자 길이 제약조건, String 타입에만 사용 (기본값: 255)

    percision, scale (DDL): BigDecimal, BigInteger 타입에서 사용.
    아주 큰 숫자나 정밀한 소수를 다룰 때만 사용
    (기본값: precision = 19, scale = 2)


7) @Enumerated

  • 자바의 enum 타입을 매핑할 때 사용
  • 속성

    value:
    EnumType.ORDINAL: enum 순서를 데이터베이스에 저장
    EnumType.STRING: enum 이름을 데이터베이스에 저장
    (기본값: EnumType.ORDINAL)


8) @Temporal

  • 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
  • 속성

    value:
    TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑
    TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑
    TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑
    (기본값: TemporalType은 필수로 지정)
    @Temporal을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의


9) @Lob

  • 데이터베이스 BLOB, CLOB 타입과 매핑
  • 속성

    지정 속성이 없음
    대신 매핑하는 필드 타입이 문자면 CLOB로, 나머지는 BLOB로 매핑


10) @Transient

  • 이 필드는 매핑하지 않음
  • 데이터베이스에 저장하지 않고 조회하지도 않음
  • 객체에 임시로 어떤 값을 보관하고 싶을 때 사용

11) @Access

  • JPA가 엔티티 데이터에 접근하는 방식을 지정
    • 필드 접근: AccessType.FIELD로 지정
      필드에 직접 접근 (private도 접근 가능)

    • 프로퍼티 접근: AccessType.PROPERTY로 지정
      접근자 Getter를 사용

profile
cornchip

0개의 댓글