이 글은 2026년 05월 12일 작성된 글입니다.

오늘은 로그인/로그아웃 처리, 작성자 연동, 게시글 수정·삭제 기능과 record 문법까지 정리했다.


1. 폼 에러 공통 요소 분리

<div th:if="${#fields.hasAnyErrors()}">
    <div th:each="err : ${#fields.allErrors()}" th:text="${err}"></div>
</div>

폼 에러 출력 코드를 공통 요소로 분리했다.


2. 레이아웃 분리

공통 header, navbar, footer 구조를 분리했다.

  • 중복 제거
  • 유지보수 편리

3. 로그인 폼 구현

<form method="post">
    <input type="text" name="username">
    <input type="password" name="password">
</form>

4. BCryptPasswordEncoder

@Bean
public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

비밀번호를 암호화해서 저장하도록 변경했다.


5. 로그아웃 처리

.logout(logout -> logout.logoutSuccessUrl("/"));

로그아웃 후 메인 페이지로 이동하도록 처리했다.


6. 로그인 상태에 따른 메뉴 변경

  • 로그인 전 → 로그인 / 회원가입
  • 로그인 후 → 로그아웃 / 글작성

7. sec:authentication

<span sec:authentication="name"></span>

현재 로그인한 회원 정보를 템플릿에서 출력할 수 있다.


8. 게시글 작성자 연동

@ManyToOne
private Member author;

게시글과 회원을 연결했다.


9. Principal 기반 작성자 저장

public String write(Principal principal)

현재 로그인한 회원 정보를 기반으로 작성자를 저장했다.


10. 게시글 삭제 기능

@PostMapping("/posts/{id}/delete")

삭제 요청을 GET에서 POST 방식으로 변경했다.


11. 게시글 수정 기능

  • 수정 폼 구현
  • 수정 처리 구현
  • 수정 완료 후 상세 페이지 이동

CRUD 중 Update 흐름이 완성되었다.


12. class 대신 record 사용

기존:

public class PostDto {
}

변경:

public record PostDto(
    String title,
    String content
) {
}

13. class vs record

구분classrecord
용도일반 클래스DTO
생성자직접 작성자동 생성
getter직접 작성자동 생성
setter가능없음
equals/hashCode직접 작성자동 생성
불변성기본 가변기본 불변

record는 DTO 작성 시 코드량을 크게 줄일 수 있다.


✅ 정리

  • Spring Security를 이용해 로그인과 로그아웃 흐름을 구현할 수 있었다.
  • Principal과 author 연동을 통해 게시글 작성자 정보를 저장할 수 있었다.
  • 게시글 수정과 삭제 기능까지 구현하면서 CRUD 흐름이 거의 완성되었다.
  • record를 사용하면 DTO 클래스를 훨씬 간결하게 작성할 수 있다.

0개의 댓글