목차

    불편함을 코드로 지웁니다.

    개발 공부 노트, 개발 도구와 문제를 해결한 과정, AI 프롬프트와 Obsidian 활용법을 정리합니다.

      ⏳ Time Log/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())