릴레이션 매핑은 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

ssar login

cos login

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