Hansel
스프링 부트 / 야매 게시판 만들기 3 본문
이번엔 게시글을 작성할 수 있게 해야한다.
게시글을 작성하면서 그 게시글의 유저 또한 현재 로그인한 유저가 될 수 있도록 해줘야 한다.
Post 또한 폼을 통한 생성이 필요하기 때문에 PostDto 클래스도 함께 작성한다.
유저를 생성했던 방식과 비슷하게 Post 폼 또한 각 필드의 내용이 PostDto에 담겨 Service의 submit을 호출한다.
submit을 해서 바로 post 객체를 persist 하기 전에 게시글의 작성자가 누구인지를 명시해야 한다.
따라서 @AuthenticationPrincipal 을 통해 현재 로그인한 유저의 정보를 가져오는데 해당 어노테이션은 Username, Password, authorities 정도만 가져와서 더욱 더 상세한 유저의 정보가 필요하다면 다른 방법이 필요하다.
하지만 유저의 아이디로 해당 객체를 찾을 수 있는 메서드가 이미 작성되어 있기 때문에 그 방식으로 유저의 정보를 가져와 PostDto의 username을 입력해준다.
Service에선 PostDto에 담긴 유저의 이름으로 해당 계정을 찾아 Post와 User 사이의 연관관계를 잡아주고 Persist 해준다.
PostRepository
@Repository
@RequiredArgsConstructor
public class PostRepository {
private final EntityManager em;
@Transactional
public void save(Post post){
em.persist(post);
}
public Post findById(String id){
Post post = em.find(Post.class, id);
return post;
}
//글 제목으로 검색
public List<Post> findPosts(String title){
List posts = em.createQuery("select p from Post p where p.title like concat('%',:title,'%')",Post.class)
.setParameter("title", title)
.getResultList();
return posts;
}
//작성자로 검색
public List<Post> findPostsByWriter(String name){
List findPosts = em.createQuery("select p from Post p right outer join p.writer u on u.name = :name",Post.class)
.setParameter("name", name)
.getResultList();
return findPosts;
}
//특정 시점 사이 글 검색
public List<Post> findByDate(LocalDateTime start, LocalDateTime end){
List findPosts = em.createQuery("select p from Post p where p.created between :start and :end",Post.class)
.setParameter("start", start)
.setParameter("end", end)
.getResultList();
return findPosts;
}
//카테고리별 검색 => 카테고리 이름으로
public List<Post> findByCategory(String name){
List findPosts = em.createQuery("select p from Post p inner join p.category c on c.name =: name",Post.class)
.setParameter("name", name)
.getResultList();
return findPosts;
}
//카테고리 무관 전체
public List<Post> findAll(){
List<Post> postAll = em.createQuery("select p from Post p", Post.class).getResultList();
return postAll;
}
public List<Post> findBySuggestion(){
return em.createQuery("select p from Post p order by p.suggestion desc",Post.class)
.setFirstResult(0)
.setMaxResults(5)
.getResultList();
}
}
다양한 검색 방법을 통해 post를 찾으려 해서 많은 메서드가 있지만 쓰는건 얼마 없다.
이 메서드들 중에선 분명 잘못된 쿼리문도 있을것이기 때문에 추후에 더 자세히 배우고 수정할 예정이다.
다 하면 대충 이렇게 나온다.
글의 본문은 조금만 보여주는게 좋기 때문에 타임리프의 abbreviate를 사용했다.
'Spring > 기초' 카테고리의 다른 글
스프링 / 트랜잭션 관리 & 예외 (0) | 2022.07.14 |
---|---|
스프링 부트 / 야매 게시판 만들기 4 (0) | 2022.03.05 |
스프링 부트 / 야매 게시판 만들기 2 (0) | 2022.03.05 |
스프링 부트 / 야매 게시판 만들기 1 (0) | 2022.03.05 |
스프링부트 기초 / 변경 감지와 병합 (0) | 2022.02.21 |