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; 
	} 
}