[Spring Boot] 11. Spring Boot Project (Blog v2 - jpa)_5.Board - List

김미숙's avatar
Jul 22, 2025
[Spring Boot] 11. Spring Boot Project (Blog v2 - jpa)_5.Board - List
‼️
릴레이션 매핑은 LAZY 전략을 쓴다

BoardController

package shop.mtcoding.blog.board; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import shop.mtcoding.blog.user.User; @RequiredArgsConstructor @Controller public class BoardController { private final BoardService boardService; private final HttpSession session; @GetMapping("/") public String list(HttpServletRequest request) { User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { request.setAttribute("models", boardService.글목록보기(null)); } else { request.setAttribute("models", boardService.글목록보기(sessionUser.getId())); } return "board/list"; } @PostMapping("/board/save") public String save(BoardRequest.SaveDTO saveDTO) { // 인증로직 User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) throw new RuntimeException("인증이 필요합니다."); boardService.글쓰기(saveDTO, sessionUser); return "redirect:/"; } @GetMapping("/board/save-form") public String saveForm() { // 인증로직 User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) throw new RuntimeException("인증이 필요합니다."); return "board/save-form"; } }

BoardService

package shop.mtcoding.blog.board; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import shop.mtcoding.blog.user.User; import java.util.List; @RequiredArgsConstructor @Service public class BoardService { private final BoardRepository boardRepository; @Transactional public void 글쓰기(BoardRequest.SaveDTO saveDTO, User sessionUser) { Board board = saveDTO.toEntity(sessionUser); boardRepository.save(board); } public List<Board> 글목록보기(Integer userId) { return boardRepository.findAll(userId); } }

BoardRepository

package shop.mtcoding.blog.board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; @RequiredArgsConstructor @Repository public class BoardRepository { private final EntityManager em; public void save(Board board) { em.persist(board); } public List<Board> findAll(Integer userId) { // Integer를 써야 null을 넘길 수 있다 // 동적 query String s1 = "select b from Board b where b.isPublic = true or b.user.id = :userId order by b.id desc"; String s2 = "select b from Board b where b.isPublic = true order by b.id desc"; Query query = null; if (userId == null) { query = em.createQuery(s2, Board.class); } else { query = em.createQuery(s1, Board.class); query.setParameter("userId", userId); } return query.getResultList(); } }

list

{{> layout/header}} <div class="container p-5"> <div class="mb-3 d-flex justify-content-end"> <form class="d-flex"> <input class="form-control me-2" type="text" placeholder="검색..."> <button class="btn btn-primary" type="button">Search</button> </form> </div> {{#models}} <div class="card mb-3"> <div class="card-body"> <div class="d-flex justify-content-between"> <h4 class="card-title mb-3">{{title}}</h4> {{^isPublic}} <div class="d-flex align-items-start"> <span class="badge bg-secondary">비공개</span> </div> {{/isPublic}} </div> <a href="/board/{{id}}" class="btn btn-primary">상세보기</a> </div> </div> {{/models}} <ul class="pagination d-flex justify-content-center"> <li class="page-item disabled"><a class="page-link" href="#">Previous</a></li> <li class="page-item"><a class="page-link" href="#">Next</a></li> </ul> </div> {{> layout/footer}}
 

Dummy Data

notion image

ssar login

notion image
 

cos login

notion image

 

OverLoading

BoardService

package shop.mtcoding.blog.board; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import shop.mtcoding.blog.user.User; import java.util.List; @RequiredArgsConstructor @Service public class BoardService { private final BoardRepository boardRepository; @Transactional public void 글쓰기(BoardRequest.SaveDTO saveDTO, User sessionUser) { Board board = saveDTO.toEntity(sessionUser); boardRepository.save(board); } public List<Board> 글목록보기(Integer userId) { if(userId == null){ return boardRepository.findAll(); }else{ return boardRepository.findAll(userId); } } }

BoardRepository

package shop.mtcoding.blog.board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; @RequiredArgsConstructor @Repository public class BoardRepository { private final EntityManager em; public void save(Board board) { em.persist(board); } public List<Board> findAll(Integer userId) { // Integer를 써야 null을 넘길 수 있다 String sql = "select b from Board b where b.isPublic = true or b.user.id = :userId order by b.id desc"; Query query = em.createQuery(sql, Board.class); query.setParameter("userId", userId); return query.getResultList(); } public List<Board> findAll() { // Integer를 써야 null을 넘길 수 있다 String sql = "select b from Board b where b.isPublic = true order by b.id desc"; Query query = em.createQuery(sql, Board.class); return query.getResultList(); } }
Share article

parangdajavous