목차
[TIL] Day 65 — Spring Boot Validation + Docker 이미지 커밋/푸시 (1/20)
날짜: 2026-01-20
기술 스택: Spring Boot Bean Validation Thymeleaf Docker Hub
한 줄 요약: Bean Validation 어노테이션으로 입력값 검증 로직 구현 + Docker 이미지를 직접 만들어 Docker Hub에 배포하는 흐름 실습
Spring Boot Validation — 입력값 검증
의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-validation'
Bean Validation 주요 어노테이션
| 어노테이션 | 설명 | 적용 대상 |
|---|---|---|
@NotNull |
null 불허 (빈 문자열 허용) | 모든 타입 |
@NotEmpty |
null + 빈 문자열 불허 | String, Collection |
@NotBlank |
null + 빈 문자열 + 공백만 있는 문자열 불허 | String |
@Email |
이메일 형식 검증 | String |
@Size(min=, max=) |
문자열 길이 범위 제한 | String, Collection |
@Min / @Max |
숫자 범위 검증 | 숫자 타입 |
@Null |
null만 허용 | 모든 타입 |
선택 기준: 문자열은 @NotBlank 우선 → @NotEmpty → @NotNull 순으로 엄격함
DTO에 검증 어노테이션 적용
// MemberFormDto.java
public class MemberFormDto {
@NotBlank(message = "이름은 필수입니다")
private String name;
@Email(message = "이메일 형식이 올바르지 않습니다")
@NotBlank(message = "이메일은 필수입니다")
private String email;
@Size(min = 8, max = 20, message = "비밀번호는 8~20자입니다")
private String password;
}
Controller에서 @Valid 사용
// MemberController.java
@PostMapping("/new")
public String createMember(@Valid MemberFormDto dto,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "member/memberForm"; // 에러 시 폼으로 돌아가기
}
memberService.saveMember(dto);
return "redirect:/";
}
포인트: @Valid + BindingResult는 항상 붙어서 선언. BindingResult가 없으면 검증 실패 시 예외 발생
Docker 이미지 직접 만들어서 Hub에 올리기
커스텀 이미지 생성 플로우
# 1. httpd 컨테이너 실행 (베이스)
docker run --name myhttpd -d -p 8888:80 httpd
# 2. 내 파일을 컨테이너 안에 복사
docker cp unico.html myhttpd:/usr/local/apache2/htdocs
docker cp doolys.jpg myhttpd:/usr/local/apache2/htdocs
# 3. 현재 컨테이너 상태를 이미지로 커밋
docker commit myhttpd 본인id/myhttpd:1.0
# 4. Docker Hub에 푸시
docker push 본인id/myhttpd:1.0
# 5. 다른 사람의 이미지를 바로 실행 (없으면 자동 pull)
docker run --name my -d -p 7777:80 qones/myhttpd:1.0
docker commit vs Dockerfile
commit→ 빠르고 간단, 재현성 낮음Dockerfile→ 단계별 명시적 선언, 재현성 높음 (실무 권장)
더 알아볼 것
- Thymeleaf에서
th:errors로 검증 에러 메시지 표시 -
@Validatedvs@Valid차이 (그룹 검증) -
docker commit후 이미지 레이어 구조 확인 (docker history) - Docker Hub 대신 AWS ECR에 이미지 저장하는 방법
-
BindingResult에러 필드별 접근 (getFieldError())
'⏳ Time Log > 1. One Day (Daily · TIL)' 카테고리의 다른 글
| [TIL] Day 67 — JPA 영속성 컨텍스트 심화 (1/22) (0) | 2026.06.08 |
|---|---|
| [TIL] Day 66 — JPA 엔티티 연관관계 매핑 + Dockerfile 커스텀 이미지 빌드 (1/21) (0) | 2026.06.08 |
| [TIL] Day 64 — Spring Boot 4.x 쇼핑몰 프로젝트 시작 + Docker Redmine 구성 (1/19) (0) | 2026.06.08 |
| [TIL] Day 63 — Java Stream/Lambda + Docker WordPress 환경 구성 (1/16) (0) | 2026.06.08 |