본문 바로가기
개발 공부하면서 오류 해결

게시글 작성시 member_id null

by chogigang 2023. 4. 10.

게시판 과 회원 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 랑 시큐리티 강의를 끊고 정주행 한다음 다시 시도해봐야겠다.