반응형

다이어그램에서 보듯 한 유저는 여러 board를 가질 수 있고 여러 board는 한 user에 속한다.

외래키 제약조건을 건다 - user_id 컬럼을 사용자 테이블의 id값과 연결되도록 저장

@Entity //db연동을 위한 모델클래스임을 명시
@Data
public class Board {
   ...

    @ManyToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private User user;

}

게시글 입장에선 many to one 관계
- @JoinColumn: 어떤 컬럼과 user 테이블이 연결될지를 설정한다. 
- referencedColumnName = "id" : user 테이블의 id와 조인된다. 생략가능

== 글 작성시 사용자 정보도 넣기 ==

BoardController.java

   @PostMapping("/form")
    public String postForm(@Valid Board board, BindingResult bindingResult, Authentication authentication){
        boardValidator.validate(board, bindingResult);
        if(bindingResult.hasErrors()) {
            return "board/form";
        }

        String username = authentication.getName();
        boardService.save(username, board);
        return "redirect:/board/list";
    }

-Authentication 을 파라미터로 선언해주면 인증정보가 알아서 담긴다. 
- getName() 으로 구한 유저 이름을 board 정보와 함께 boardService에 전달

@Service
public class BoardService {

    @Autowired
    private BoardRepository boardRepository;

    @Autowired
    private UserRepository userRepository;

    public Board save(String username, Board board){
        //1. 넘겨받은 username을 가지고 user의 id 조회

        User user = userRepository.findByUsername(username);
        board.setUser(user);

        return boardRepository.save(board);

    }
}

BoardService에서는 컨트롤러에서 넘겨받은 username을 가지고 user 정보를 조회한다.
-> 그러기위해선  UserRepository 에 관련 메소드를 만들어줘야한다. 

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username); //컬럼이름에 일치하는 사용자 데이터를 가져온다.
}

 

@Entity //db연동을 위한 모델클래스임을 명시
@Data
public class User {

    ...
    @OneToMany(mappedBy = "user")
    private List<Board> boards = new ArrayList<>();

}

- mappedBy 로 Board 클래스의 user를 적어준다.
- onetomany, manytoone 관계에서 보통 many쪽  에서 소유하는쪽을 @JoinColumn을 써서 적어준다

+ Recent posts