쌓고 쌓다
[스프링 부트] 회원 정보(세션)로 게시글 작성 - 32 본문
이제 카카오 로그인 도입으로
회원을 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>
동작
'프로그래밍 > spring' 카테고리의 다른 글
Ajax data 여러개 넣어, @RequestBody로 여러개 받기? (0) | 2023.10.04 |
---|---|
Cannot handle managed/back reference 'defaultReference': back reference type ... not compatible with managed type ... (0) | 2023.10.01 |
HTML에서 날짜 입력 받아 서버에서 LocalDate로 받기 (0) | 2023.09.20 |
[스프링 부트] 모든 요청 로그 남기기(인터셉터) (0) | 2023.09.19 |
[스프링 부트] 카카오 로그인 회원 저장 방법- 31 (0) | 2023.09.17 |