머지는 rebase and merge로 한다.
type: subject
body
type은 아래와 같다.
예시) feat: 로그인 버튼 구현
body는 옵션이다. 한 줄 당 72자 내로 작성한다. 무엇을 왜 변경했는지에 대해 초점을 둔다.
배포는 아직 아무도 경험한 적이 없어서, CI / CD 는 마지막 스프린트 때 적용해보기로 결정했다.
@MappedSuperClass
자식 칼럼 중 공통된 칼럼을 부모 클래스로 모으고 객체 상속 관계로 만든다.
현재 우리는 옷장, 착용 등 다양한 곳에서 생성 시간과 수정 시간을 사용하고 있다. 부모 클래스 BaseEntity에서 이 두 칼럼을 관리하기 위해 이 애너테이션을 써준다.
@EntityListeners(AuditingEntityListener.class)
등록일, 수정일과 같은 메타데이터를 자동화해주는 애너테이션이다. 엔티티가 데이터베이스에 INSERT, UPDATE 등이 됐을 때 특정 필드에 값을 자동으로 채워준다.
이 안에는 또 다른 애너테이션이 존재하는데,
| 어노테이션 | 역할 | 설명 |
|---|---|---|
@CreatedDate | 생성일자 | 엔티티가 생성되어 저장될 때 시간이 자동 저장됩니다. |
@LastModifiedDate | 수정일자 | 엔티티의 값이 변경될 때 시간이 자동 저장됩니다. |
@CreatedBy | 생성자 | 엔티티를 생성한 사람의 ID를 저장합니다. (설정 필요) |
@LastModifiedBy | 수정자 | 엔티티를 마지막으로 수정한 사람의 ID를 저장합니다. |
record는 변경 불가 데이터 객체를 쉽게 만들 수 있게 하는 클래스 타입이다.
메서드 자동생성, 생성자 자동 생성, 필드 불변성 보장 (private final 로 자동 선언) 따라서 final을 선언할 필요가 없다.
record의 주된 목적은 객체 간에 불변 데이터를 전달하는 것이므로 DTO를 표현하는 데 적합하다.
JSON이나 XML 데이터를 나타내는 데이터 전송 객체를 다룰 때 특히 유용하다.
public class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
@Override
public boolean equals(Object o) { ... }
@Override
public int hashCode() { ... }
@Override
public String toString() { ... }
}
를 record를 사용하면
public record User(String name, int age) { }
끝. {} 대신 ()를 사용하는 것을 외워두자.