Hansel

스프링 부트 / 야매 게시판 만들기 3 본문

Spring/기초

스프링 부트 / 야매 게시판 만들기 3

핑슬 2022. 3. 5. 20:39

이번엔 게시글을 작성할 수 있게 해야한다.

 

게시글을 작성하면서 그 게시글의 유저 또한 현재 로그인한 유저가 될 수 있도록 해줘야 한다.

 

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를 찾으려 해서 많은 메서드가 있지만 쓰는건 얼마 없다.

이 메서드들 중에선 분명 잘못된 쿼리문도 있을것이기 때문에 추후에 더 자세히 배우고 수정할 예정이다.

 

메인화면html
메인화면을 띄울 controller

다 하면 대충 이렇게 나온다.

글의 본문은 조금만 보여주는게 좋기 때문에 타임리프의 abbreviate를 사용했다.