
이 글은 2026년 05월 12일 작성된 글입니다.
오늘은 로그인/로그아웃 처리, 작성자 연동, 게시글 수정·삭제 기능과 record 문법까지 정리했다.
<div th:if="${#fields.hasAnyErrors()}">
<div th:each="err : ${#fields.allErrors()}" th:text="${err}"></div>
</div>
폼 에러 출력 코드를 공통 요소로 분리했다.
공통 header, navbar, footer 구조를 분리했다.
<form method="post">
<input type="text" name="username">
<input type="password" name="password">
</form>
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
비밀번호를 암호화해서 저장하도록 변경했다.
.logout(logout -> logout.logoutSuccessUrl("/"));
로그아웃 후 메인 페이지로 이동하도록 처리했다.
<span sec:authentication="name"></span>
현재 로그인한 회원 정보를 템플릿에서 출력할 수 있다.
@ManyToOne
private Member author;
게시글과 회원을 연결했다.
public String write(Principal principal)
현재 로그인한 회원 정보를 기반으로 작성자를 저장했다.
@PostMapping("/posts/{id}/delete")
삭제 요청을 GET에서 POST 방식으로 변경했다.
CRUD 중 Update 흐름이 완성되었다.
기존:
public class PostDto {
}
변경:
public record PostDto(
String title,
String content
) {
}
| 구분 | class | record |
|---|---|---|
| 용도 | 일반 클래스 | DTO |
| 생성자 | 직접 작성 | 자동 생성 |
| getter | 직접 작성 | 자동 생성 |
| setter | 가능 | 없음 |
| equals/hashCode | 직접 작성 | 자동 생성 |
| 불변성 | 기본 가변 | 기본 불변 |
record는 DTO 작성 시 코드량을 크게 줄일 수 있다.