Spring 프레임 워크를 처음 공부하면서 데이터베이스와 첫 연동을 하게 되었다.
데이터 베이스는 MySQl을 사용하였는데 딱히 이유는 없다. 그냥 이것저것 많이 해보고 싶어서 한거다.
node.js를 통해서는 DB 연동을 수도 없이 많이 해보았지만 이번에 처음으로 Spring을 공부하게 되면서 스프링을 DB 연동에 대해서 정리해보고자 한다.
엔티티는 모델 또는 도메인 모델이라고 불리기도 한다.
먼저 스프링에서는 엔티티로 만들기 위해 @Entity 어노테이션을 적용해야 JPA가 인식할 수 있다.
다양한 어노테이션에 대해서 알아보자.
고유 번호 id 속성에 적용하는 어노테이션으로 id 속성을 기본 키로 지정한다. 기본 키로 지정하게 되면 id 속성의 값은 데이터베이스에 저장할 때 동일한 값으로 저장할 수 없다. 고유 번호를 기본키로 지정하게 되면 고유 번호는 엔티티에서 각 데이터를 구분하는 유효한 값을 중복되지 않는다.
속성에 값을 따로 지정하지 않아도 1씩 자동으로 증가하게 된다. GenerationType.IDENTITY를 사용하면 독립적인 시퀀스를 생성하여 번호를 증가시키게 된다.
엔티티의 속성은 테이블의 컬럼명과 일치하는 컬럼의 세부 설정을 위해 사용한다.
- @Column(name=""): Entity 객체를 사용하여 DB에 저장을 하면 기본적으로 객체에 만들어진 변수명으로 DB Column의 이름이 정해진다. 프로그래밍을 하면서 사용하는 변수명과 DB에 저장되는 column 명을 다르게 해야하는 상황에 사용한다.
- @Column(length=~): 해당 컬럼 값의 length를 지정한다. (String 타입만 가능)
- @Column(nullable=false): nullable을 false로 하게 되면 filed가 notNull column으로 설정된다.
- @Column(unique=true): 해당 column을 unique하게 설정해준다.
-> unique: 중복불가- @Column(updatable = false) : updatable=false를 하면 해당 column은 update가 불가능하다. (default값은 true)
- @Column(insertable = false) : insertable=false를 하면 해당 column은 insert가 불가능하다. (default값은 true)
- @Column(columnDefinition = "TEXT") : '내용' 처럼 글자 수를 제한할 수 없는 경우에 사용한다.
❗️ 주의❗️
- entitiy column 설정을 변경할 때 length, nullable, name 등의 기본 세팅값에 변경이 있는 설정들은 무조건 테이블을 초기 세팅할때만 적용된다.
- insertable, updatable의 경우는 테이블 생성 이후 데이터 추가 및 업데이트 할때도 적용이 가능하며 해당 설정은 애플리케이션 내에서 동작한다.
- DB에서 enum의 값들을 기본적으로 데이터를 0,1,~ 순으로 값을 저장한다.(default - ORDINAL)
- Gender 라는 column이 있다고 가정하였을 때 DB에 값을 저장하면 MALE은 0, FEMALE은 1로 DB에 저장된다.
- value = EnumType.STRING 라는 옵션을 통해 String으로 변경이 가능하다.
Gender.java(Enum)
// enum은 java에서 사용하는 상수 객체이다.
public enum Gender {
MALE,
FEMALE
}
User.java
@Entity
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Builder
public class User {
...
...
@Enumerated(value = EnumType.STRING)
private Gender gender;
}
날짜 타입을 사용하고 싶을 때 사용한다.
- DATE, TIME, TIMESTAMP가 존재한다.
- JAVA 8 이상에서는 LocalDate, LocalDateTime 타입이 지원되기 때문에 @Temporal을 사용하지 않아도 된다!
@Transient annotatoin을 붙이면 해당 변수는 DB와 상관없이 객체의 데이터로 쓸 수 있게된다.