쌓고 쌓다

[스프링 부트] 회원 정보(세션)로 게시글 작성 - 32 본문

프로그래밍/spring

[스프링 부트] 회원 정보(세션)로 게시글 작성 - 32

승민아 2023. 10. 1. 14:51

이제 카카오 로그인 도입으로

회원을 Member 클래스로 관리할 수 있게 되었다.

그럼 게시글 작성시 들어가는 작성자 정보도 Member로 바꿔보자.

 

Poster 테이블 컬럼 변경

ALTER TABLE poster DROP writer; -- 기존 writer 필드 제거
ALTER TABLE poster ADD writer bigint; -- 외래 키를 위한 필드 생성
ALTER TABLE poster ADD FOREIGN KEY (writer) REFERENCES member(id); -- 외래 키 등록

기존 writer 필드(varchar)를 외래 키로 사용하기 위해 변경 과정이 필요하다.

 

Poster 엔티티 변경

Poster - 변경 전 writer

@Entity
@Getter
@Setter
@ToString
public class Poster {
    ...
    private String writer;
    ...
}

변경전의 게시글 작성자에 대한 정보는 게시글 작성시에 input 태그로 직접 입력을 했다.

 

Poster  - Member로  writer 변경

@Entity
@Getter
@Setter
@ToString
public class Poster {
    ...
    @ManyToOne
    @JoinColumn(name="writer")
    private Member writer;
    ...
}

게시글에서 작성자로의 관계는 N:1 관계이다.

여러 게시글은 하나의 작성자를 갖는것이다.

그래서 writer 필드에 @ManyToOne로 연관관계를 처리했다.

또한 다쪽인 Poster에서 외래 키를 관리하므로 @JoinColumn으로 외래 키 매핑을 해준다.

이때 name을 지정하지 않으면 SQL 사용시 writer_id로 찾으므로 name 속성 값을 writer로 지정해준다.

(Poster 테이블의 외래 키 컬럼의 이름이 현재 writer이다.)

 

 

이제 게시글 작성시 writer에 대한 필드 값은 Member를 갖는다.

Poster 테이블의 writer 필드는 외래 키를 가지며 writer 외래 키 값은 Member의 PK를 갖는다.

 

게시글 작성 코드 변경

앞전에 아래의 코드를 통해 로그인시 세션에 회원 정보를 저장했다.

HttpSession session = request.getSession();
session.setAttribute(SessionConst.LOGIN_MEMBER, member);

 

우리는 이제 세션에 저장된 회원 정보를 가지고 게시글의 작성자를 처리해주면 된다.

 

@PostMapping("/posters/{category}")
public String write(@PathVariable("category") Category category,
                        @SessionAttribute(name=SessionConst.LOGIN_MEMBER) Member loginMember,
                        @Validated @ModelAttribute(name = "poster") PosterSaveForm form, BindingResult bindingResult) throws IOException {

    if(bindingResult.hasErrors()) {
        System.out.println("bindingResult = " + bindingResult);
        return "posters/createPosterForm";
    }
    Poster poster = new Poster();
    poster.setWriter(loginMember);
    ...
}

@SessionAttribute로 세션을 조회하여 loginMember에 회원 객체를 받는다.

이 회원 객체를 Poster의 writer 필드로 초기화시켜주면 된다.

 

이제 템플리 엔진인 타임리프로 게시글 정보를 뿌릴때 회원에 대한 정보는 아래와 같이 출력해주면된다.

<th>작성자</th>
<td th:text="${poster.writer.name}"></td>

 

동작

Comments