게시판 과 회원 DB를 맵핑 을 해서 로그인을 하고 게시글을 작성했을때 해당 게시글의 member_id 를 뜨게 하고싶었다
@Id // pk 컬럼 지정. 필수
@GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment
private Long id;
@Column(length = 20, nullable = false) // 크기 20, not null
private String boardWriter;
@Column // 크기 255, null 가능
private String boardPass;
@Column
private String boardTitle;
@Column(length = 500)
private String boardContents;
@Column
private int boardHits;
여기서 이제 로그인 회원 기능을 추가 했으니 boardWriter 를 삭제하고 이 구간을 member_id 로 체우고 싶었다. 그렇게 해야 나중에 수정, 삭제 할때 권한을 넣을수 있기 때문에 수정을 했다
package cho.boardplus.entity;
import cho.boardplus.dto.BoardDTO;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Getter
@Setter
@Table(name= "board")
public class BoardEntity extends BaseEntity {
@Id //pk 컬럼 지정. 필수
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id; //id 값
@Column(nullable = false)
private String boardTitle; //제목
@Column(length = 500)
private String boardContents; //내용
@Column
private int boardHits;//조회수
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member; // 회원 추가
나중에 게시판은 댓글,이미지 도 맵핑 해야 하기 때문에 N:1 맵핑이 좋아 보여서 해놓고
public static BoardEntity toSaveEntity(BoardDTO boardDTO) {
BoardEntity boardEntity = new BoardEntity();
boardEntity.setMember(boardDTO.getMember()); //맴버 추가
boardEntity.setBoardTitle(boardDTO.getBoardTitle());
boardEntity.setBoardContents(boardDTO.getBoardContents());
boardEntity.setBoardHits(0);
return boardEntity;
}
//게시글 수정 엔티티 DTO 변환
public static BoardEntity toUpdateEntity(BoardDTO boardDTO) {
BoardEntity boardEntity = new BoardEntity();
boardEntity.setId(boardDTO.getId());
boardEntity.setMember(boardDTO.getMember()); //맴버 추가
boardEntity.setBoardTitle(boardDTO.getBoardTitle());
boardEntity.setBoardContents(boardDTO.getBoardContents());
boardEntity.setBoardHits(boardDTO.getBoardHits());
return boardEntity;
}
변환도 해놨다.
@Getter
@Setter
@ToString//필드값 확인할때 사용
@NoArgsConstructor //기본 생성자
@AllArgsConstructor // 모든 필드를 매개변수로 하는 생성자.
public class BoardDTO {
// CRUD 파트
private Long id; //게시글 id
private String boardTitle; // 게시글 이름
private String boardContents; //게시글 내용
private int boardHits; //조회수
private LocalDateTime boardCreatedTime; //게시글 작성 시간
private LocalDateTime boardUpdatedTime; // 게시글 수정시간
private Member member;//회원
DTO도 수정
public static BoardDTO toBoardDTO(BoardEntity boardEntity) {
BoardDTO boardDTO = new BoardDTO();
boardDTO.setId(boardEntity.getId());
boardDTO.setBoardTitle(boardEntity.getBoardTitle());
boardDTO.setBoardContents(boardEntity.getBoardContents());
boardDTO.setBoardHits(boardEntity.getBoardHits());
boardDTO.setBoardCreatedTime(boardEntity.getCreatedTime());
boardDTO.setBoardUpdatedTime(boardEntity.getUpdatedTime());
boardDTO.setMember(boardEntity.getMember());
return boardDTO;
}
서비스에서 페이징 처리 할때도 writer 삭제하고 member를 집어 넣고 다 수정했다
Page<BoardDTO> boardDTOS = boardEntities.map(board -> new BoardDTO(board.getId(),board.getMember(),board.getBoardTitle(), board.getBoardHits(),board.getCreatedTime()));
return boardDTOS;
}
다 완료하고 이제 게시글을 작성 했을때 게시글은 작성 했지만 member_id 가 null로 입력해진다.
맵핑 관련 문제는 없는거같다 DTO 의 문제인가? 엔티티 설정을 잘못했나?
뷰단에서 문제인가? csrf 토큰의 문제인가? 저녁 내내 확인 이것저것 확인 해보고 테스트 코드를 작성을 할려고 하니
빈 관련해서 또 문제가 생겨서 확인을 하기 힘들어 졋다.. 좀 장기전이 될거같은 느낌이 든다 좀 간단한건대...
뭔가 꼬인 느낌이 든다.
5일째 지나서 AuditConfig 사용해서 글 작성시 자동으로 아이디를 불러와서 created_by 테이블에 회원 아이디가 들어오도록 구현을 했다
package cho.boardplus.confing;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
@EnableJpaAuditing
public class AuditConfig {
@Bean
public AuditorAware<String> auditorAware(){
return new AuditorAwareImpl();
}
}
package cho.boardplus.confing;
import org.springframework.data.domain.AuditorAware;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import java.util.Optional;
public class AuditorAwareImpl implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String userId = "";
if (authentication != null) {
userId = authentication.getName();
}
return Optional.of(userId);
}
}
정확히는 member_id 를 넣고싶었지만 아무리 해도 현제 나의 JPA 숙련도랑 시큐리티 숙련도로는 도저히 못할거같아서
이렇게 넘어간다 곧 중간고사라서 여기에만 집중하기에도 무리가 있다.. 그래도 회원 정보를 맵핑하는 첫번째 시도는
이렇게 로그인할때 회원 id를 받아오는걸로 구현을 해봤다 이메일은 중복이 가능하기 때문에 중복없는 member_id 로 받아오면 좋지만 나중에 중간고사 끝나고 JPA 랑 시큐리티 강의를 끊고 정주행 한다음 다시 시도해봐야겠다.