Service 객체에 JpaRepository 객체를 주입해서 repository에서 save 메서드를 이용해 create를 진행해 보았습니다.

 

이번엔 Create를 알아서 해주게 하기 위해 DTO를 어떻게 짜야하는지에 대해 알아보도록 하겠습니다.

 


1. DTO Bean의 이름은 Entity

 

Controller, Service, Repository 이런 식으로 각각의 Bean들을 @Component라고 지정하지 않고 의미별로 시멘틱하게 어노테이션을 다르게 달았었는데요.

 

DTO의 Bean 이름은 Entity입니다. 이 어노테이션을 달아주면 스프링이 해당 클래스를 Entity로 인식을 합니다.

 

다시 이전에 작성했던 DTO를 좀 더 뜯어보도록 하겠습니다.

 

@Table 어노테이션의  name 값으로 db에 만들 테이블의 이름을 정할 수 있고, 그 외에 다양한 속성들을 넣어 줄 수가 있습니다.

 

@Entity
@Table(name = "my_table", uniqueConstraints = {
    @UniqueConstraint(name = "uk_column1", columnNames = "column1"),
    @UniqueConstraint(name = "uk_column2", columnNames = "column2")
})
public class MyEntity {
    // 엔티티 필드와 메서드들
}

Table의 name은 테이블의 이름을 정해주는 것이라고 했고, uniqueConstraints는 제약조건의 이름과 어떤 컬럼에 해당 제약조건을 넣어줄지를 정해줄 수 있습니다.

 

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "my_column", nullable = false)
    private String data;
    
    // Getter, Setter, 등의 메서드들
}

Id 어노테이션을 통해 Id값을 정해줄 수도 있고, 자동으로 Id값을 생성할 수도 있습니다.

 

2. 필드에 들어갈 어노테이션들 (중요 : @Id, @GeneratedValue, @Column)

@GenerateValue를 이용해서 GenerationType을 정해줄 수 잇는데, IDENTITY는 MySQL의 AUTO_INCREMENT를 이용하는 방식이고

 

SEQUENCE를 이용하면 오라클의 시퀀스 nextval을 이용하는 등 SQL에 맞춰서 적절한 전략을 선택하는 것이 좋습니다.

 

클래스에 @SequenceGenerator 어노테이션을 이용해서 시퀀스의 이름과 별명을 지어줄 수 있고, initialValue를 설정해줘서 시퀀스를 만들어 줄 수 있습니다. allocationSize를 설정해주면 시퀀스를 만들어 줄 수도 있어 성능 이슈를 해결할 수도 있습니다. 

 

@Column 어노테이션에서는 column의 이름을 정해줄 수 있고, nullable 여부를 결정할 수도 있습니다.

 

그 외에도 length, precision, scale 등으로 길이, 자릿수, 소수점 몇 자리까지 나타낼 것인지 등을 설정해 줄 수 있습니다.

 

 

@Column(name = "user_name", length = 50, nullable = false)
    private String username;
    
    @Transient
    private String fullName;
    
    @Temporal(TemporalType.DATE)
    private Date birthDate;
    
    @Enumerated(EnumType.STRING)
    private UserType userType;

@Transient는 데이터베이스에 들어가지 않고 메모리만 차지하게 만드는 어노테이션이고

 

@Temporal은 데이트 타입을 정해주는 어노테이션입니다.

 

@Enumerated는 UserType을 정해주는 건데, 미리 정해진 문자열을 지정할 수 있는 객체죠.

 

다른 프로그래밍 언어에서 자주 사용되는 문자나 숫자를 대문자 변수로 사용해보신 적이 있으시다면 그걸 생각하시면 편합니다. 그걸 모아놓은 객체에요.

 

EnumType.STRING 을 설정해주면 지정해놓은 문자열을 그대로 사용할 수 있고, ORDINAL을 사용하면 순서대로 0, 1, 2 숫자들이 들어가는데 순서가 바뀌면 꼬일 수 있으니 STRING을 추천한다고 합니다.

 

이 정도만 알아두고 나중에 추가적으로 필드에 무언가를 세세하게 조정하고 싶을 때 필요에 따라 검색하면서 필드를 만들면 될 것 같습니다.

+ Recent posts