TIL&WIL
23.02.08 TIL
ultramancode
2023. 2. 9. 02:42
☑️ @ColumnDefault 사용 시 작은따옴표( ' ) 주의
@ColumnDefault("'ACTIVE'") // 작은따옴표
@Column(nullable = false, length = 10)
private String status;
실수 예시 | 실제 DDL 결과 |
@ColumnDefault("ACTIVE") | DEFAULT ACTIVE → DB가 컬럼명으로 오해하거나 오류 |
@ColumnDefault("'ACTIVE'") | DEFAULT 'ACTIVE' → 정상 |
참고)
@Column(columnDefinition = "varchar(10) default 'ACTIVE'") 처럼 DDL 전체를 직접 지정할 수도 있음
☑️ @DynamicInsert – DB 디폴트값을 그대로 쓰고 싶을 때
@Entity
@DynamicInsert // null 필드를 INSERT 구문에서 제외
public class User {
@ColumnDefault("now()")
private LocalDateTime createdAt; // → INSERT 시 값 미지정
}
장점 | 단점 |
DB 레벨 디폴트를 그대로 활용 (코드 수정 ↓) | SQL 문장이 매번 달라져 Statement 캐싱 효율 ↓ |
컬럼 추가 시 기존 INSERT 코드 무변경 | Default값 깜빡해서 Audit 필드가 null 삽입되는 실수 주의 |
이거 관련해서는 추후 다시 글을 써야겠다.
23.02.10 관련 게시글 작성 완료 : https://tw-dev.tistory.com/72
☑️ 레이어드 아키텍처 한 눈에
Controller ─ REST, MVC 엔드포인트
Service ─ 트랜잭션, 비즈니스 흐름
Domain Model ─ 핵심 규칙·엔티티 메서드
Repository ─ DB 접근(JPA, MyBatis…)
규칙
- Controller -> Service -> Repository 순서만 의존 (역방향 금지)
- Domain 메서드(비즈니스 로직)는 Service 가 아닌 엔티티 내부에 두는 게 OOP 측면에서 깔끔
☑️ 상태값 처리 방식 (boolean vs Enum)
- 현재 프로젝트에서 상태값을 boolean으로 처리할지 Enum으로 따로 뺄지 의견 충돌이 있었고, 추후 확장성을 위해 Enum으로 빼기로 결정했다. 스택오브플로우에서 관련 글들을 검색해볼 때도 어느정도 입장이 갈리는 만큼 뭐가 정답이라고 할 수는 없을 것 같지만 개인적으로는 약간의 성능 향상보다는 유지보수성이 더 중요하다고 판단했다.
정리하자면
- 플래그가 2 개로 절대 고정 & 퍼포먼스 극한 요구 → boolean
- 대부분의 CRUD 시스템 / 상태 확장 가능성 → enum 가독성 우위
항목 | boolean | Enum(열거형) |
가독성 | true / false (맥락 필요) | ACTIVE / INACTIVE 직관적 |
확장성 | 두 값만 가능 | 상태 추가(DELETED, SUSPENDED …) 용이 |
DB 저장 | tinyint(1) (0/1) | varchar-int 매핑, 길이 길어짐 |
메모리 | 1 비트(primitive) | 내부 정수 + Class 메타 데이터 |
public enum Status {
ACTIVE,
INACTIVE;
public boolean isActive() {
return this == ACTIVE;
}
}