목차

    ⏳ Time Log/1. One Day (Daily · TIL)

    [TIL] Day 65 — Spring Boot Validation + Docker 이미지 커밋/푸시 (1/20)

    this.Serena 2026. 6. 8. 21:27

    [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로 검증 에러 메시지 표시
    • @Validated vs @Valid 차이 (그룹 검증)
    • docker commit 후 이미지 레이어 구조 확인 (docker history)
    • Docker Hub 대신 AWS ECR에 이미지 저장하는 방법
    • BindingResult 에러 필드별 접근 (getFieldError())