국비

[ 58일차 23~24 ] 수업 정리 - Spring boot

코딩하는냥이 2025. 7. 9. 17:02
반응형

이번 수업에서는 Spring Security를 통한 사용자 인증 기반 회원가입 기능을 구현하고, 게시판의 페이징 UI도 개선하였습니다. 사용자 데이터 저장, 비밀번호 암호화, 입력 검증 등 실전 프로젝트에서 필수적인 기능들을 학습하였습니다.


1. 📄 게시판 페이징 UI 개선

<td th:text="${paging.getTotalElements - (paging.number * paging.size) - loop.index}"></td>
  • 게시글 번호를 전체 글 수 기준으로 역순 출력하기 위한 계산식 사용
    예: 전체 100개일 경우 첫 번째 페이지의 첫 글은 100번, 다음은 99번...
<span class="text-danger small ms-0"
      th:if="${#lists.size(question.answerList) > 0}"
      th:text="|[${#lists.size(question.answerList)}]|"></span>
  • 댓글 수가 1개 이상인 경우 표시: [3]처럼 표시됨

2. 🔐 Spring Security 기본 설정

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(auth -> 
            auth.requestMatchers("/**").permitAll()
        );
        return http.build();
    }

    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  • @EnableWebSecurity로 Spring Security 활성화
  • filterChain()으로 모든 요청을 인증 없이 허용 (개발 단계용)
  • BCryptPasswordEncoder로 비밀번호 암호화

3. 👤 회원 엔티티 및 저장

📦 SiteUser

@Getter
@Setter
@Entity
public class SiteUser {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(unique = true)
    private String username;
    
    private String password;

    @Column(unique = true)
    private String email;
}
  • 사용자 아이디와 이메일은 중복 불가(unique)
  • 비밀번호는 암호화 저장

4. 🛠 사용자 등록 서비스

public SiteUser create(String username, String email, String password) {
    SiteUser user = new SiteUser();
    user.setUsername(username);
    user.setEmail(email);
    user.setPassword(passwordEncoder.encode(password));
    return userRepository.save(user);
}
  • 비밀번호는 반드시 암호화 후 저장
  • 저장 시점에 userRepository.save(user)

5. 📋 회원가입 폼과 검증

📑 UserForm

@NotEmpty(message = "아이디가 비어있습니다.")
@Size(min = 3, max = 15)
private String username;

@NotEmpty(message = "비밀번호가 비어있습니다.")
private String password;

private String passwordCheck;

@Email
@NotEmpty(message = "이메일이 비어있습니다.")
private String email;

📎 UserController

@PostMapping("/signup")
public String signup(@Valid UserForm userForm, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) return "signup_form";
    if (!userForm.getPassword().equals(userForm.getPasswordCheck())) {
        bindingResult.rejectValue("passwordCheck", "passwordincorrect", "비밀번호가 서로 다릅니다.");
        return "signup_form";
    }
    this.userService.create(userForm.getUsername(), userForm.getEmail(), userForm.getPassword());
    return "redirect:/";
}
  • @Valid로 입력 검증
  • 비밀번호 일치 확인
  • 에러가 있으면 같은 폼 재출력

6. 🖥 회원가입 페이지 (Thymeleaf)

<form th:action="@{/user/signup}" method="post" th:object="${userForm}">
    <div th:replace="~{form_errors :: formErrorsFragment}"></div>
    ...
</form>
  • 입력 검증 결과는 공통 에러 조각 (form_errors) 으로 처리
  • th:field="*{필드명}"으로 바인딩

💡 포인트 정리

  • Spring Security로 회원 인증 구조 기본 설정
  • 사용자 입력 검증 및 비밀번호 암호화 적용
  • BCryptPasswordEncoder는 보안상 안전한 해시 알고리즘
  • Thymeleaf와 Spring Validation을 활용한 입력값 검증 및 에러 처리
  • 게시판 UI에서 댓글 수 및 글 번호를 가독성 있게 개선

📌 정리하자면, 58일차에는 Spring Security 기반의 사용자 가입 기능을 처음으로 도입했습니다. 암호화된 비밀번호 저장, 입력 검증, 폼 유효성 체크까지 실제 서비스에서 꼭 필요한 인증의 기초를 실습했습니다.