
BoardRepository
@RequiredArgsConstructor @Repository public class BoardRepository { private final EntityManager em; @Transactional public Board save(Board board) { //순수했던 애가 (우유가) em.persist(board); //어딘가에 잠깐 담겼죠? (초코우유가 됨) return board; //return도 안해도 됨 }
persist는 테스트할 필요는 없을 것 같다!
내가 만든 것도 아니고, 이미 잘 만들어져서 검증된 프레임워크에 들어간 라이브러리니까!
SaveDTO 만들기 - BoardRequest
ORM 인서트할 때, User 객체에 id만 들어가 있어도 된다. (즉, 비영속 객체도 된다)
그러나 추천 안함!!!!!! 없을 수도 있기 때문에 조회해서(영속화 시켜서) 넣어라!
영속화가 되었다 = DB에 있다 = 안전하다 (+세션도 괜찮다)
없는 걸 넣으면 DB가 죄다 망가져 버리기 때문…

public class BoardRequest { @Data public static class SaveDTO { private String title; private String content; //DTO를 클라이언트로부터 받아서, PC에 전달하기 위해 사용! //이거 save하려면 Entity로 바꿔야함! public Board toEntity(User user) { return Board.builder() .title(title) .content(content) .user(user) //세션 유저를 담아줄 곳 .build(); } } }
ORM으로 변경 되었기 때문에 User 객체를 넣어줘야함! User 객체는 세션에 있기 때문에 나중에 여기에 session을 넣어주면 됨
만약 user id를 넣고 싶으면 native쿼리를 직접 작성해야 함!
여기 builder 사용하려면 Board에 @Builder 가 있어야 함~!

이 User 객체에 pk 키만 들어가있어도 됨! 그러나 위험한 코드. 1번이 없을 수도 있잖아.
그러나 세션은 없을 수가 없기 때문에 안전하다! (세션에 있는 유저 객체는 100% 있으니!)
5번으로 한 번 조회를 해서, 영속성 객체로 만들고?? 머지??

5번 넣으면 (5번 유저가 없으니) FK 위배 라고 터짐!

애가 FK 제약 조건도 걸어준다는 것

3번 넣으면 작성자가 3번으로 들어감!
BoardController
@RequiredArgsConstructor @Controller public class BoardController { private final BoardRepository boardRepository; private final HttpSession session; @PostMapping("/board/save") public String save(BoardRequest.SaveDTO requestDTO){ User sessionUser = (User) session.getAttribute("sessionUser"); //권한 체크는 생략 boardRepository.save(requestDTO.toEntity(sessionUser)); return "redirect:/"; }
DTO를 만들었기 때문에 코드도 깔끔해지는 것!
toEntity = insert하는 DTO에서만 만든다!
로그인 안하고 board/save-form 에 들어가서 글을 써보았다.


그럼 이 부분이… User 객체가 null로 들어가겠지?
ORM은 객체가 들어간다 (특이)

그러면 봐라!! 로그인 안하고 게시글을 쓴 귀신이 있음 !!!
→ 개인 정보법 위반 → 신고 당하고 → 잡혀가고 → 집유 살고 → 인생 망하고
→ 오어스를 써라
만약 이런 데이터가 들어오면 아무도 모르게… 바로 DB에 들어가서 delete를 하고, 내가 delete를 했다는 로그 또한 싹 지워버리기
제대로 로그인 후 글쓰기

shift + enter 치면 줄 밑으로 내려옴
Share article