728x90
비즈니스 계층 구현
비즈니스 계층(서비스 계층)
- 고객의 요구사항을 반영하는 계층
- 업무의 단위로 설계(트랜잭션의 단위)
- 여러 개의 Mapper나 DAO를 사용하는 경우가 존재
- xxxService 형태로 작성
서비스 패키지 설정
- 인터페이스와 클래스를 설정하고, root-context.xml에 등록
package org.zerock.service;
import java.util.List;
import org.zerock.domain.BoardVO;
public interface BoardService { // 고객과 의사소통하는 용어로 작성
public void register(BoardVO boardVO);
public BoardVO get(Long bno);
public int modify(BoardVO boardVO);
public int remove(Long bno);
public List<BoardVO> getList();
}
package org.zerock.service;
import java.util.List;
import org.springframework.stereotype.Service;
import org.zerock.domain.BoardVO;
import org.zerock.mapper.BoardMapper;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import lombok.extern.log4j.Log4j;
@Log4j
@Service
@RequiredArgsConstructor
@ToString
public class BoardServiceImpl implements BoardService{
private final BoardMapper boardMapper;
@Override
public void register(BoardVO boardVO) {
boardMapper.insert(boardVO);
}
@Override
public BoardVO get(Long bno) {
return boardMapper.read(bno);
}
@Override
public int modify(BoardVO boardVO) {
return boardMapper.update(boardVO);
}
@Override
public int remove(Long bno) {
return boardMapper.delete(bno);
}
@Override
public List<BoardVO> getList() {
return boardMapper.getList();
}
}
package org.zerock.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardServiceTest {
@Autowired
private BoardService boardService;
@Test
public void testPrint() {
log.info(boardService);
}
}
서비스 계층 준비 완료
테스트
package org.zerock.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardServiceTest {
@Autowired
private BoardService boardService;
(...생략...)
@Test
public void testGetList() {
boardService.getList().forEach(BoardVO -> log.info(boardService));
}
}
※
package org.zerock.service;
import java.util.List;
import org.zerock.domain.BoardVO;
public interface BoardService { // 고객과 의사소통하는 용어로 작성
// public void register(BoardVO boardVO);
public Long register(BoardVO boardVO);
(...생략...)
}
package org.zerock.service;
import java.util.List;
import org.springframework.stereotype.Service;
import org.zerock.domain.BoardVO;
import org.zerock.mapper.BoardMapper;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import lombok.extern.log4j.Log4j;
@Log4j
@Service
@RequiredArgsConstructor
@ToString
public class BoardServiceImpl implements BoardService{
private final BoardMapper boardMapper;
// @Override
// public void register(BoardVO boardVO) {
//
// boardMapper.insert(boardVO);
//
// }
@Override
public Long register(BoardVO boardVO) {
boardMapper.insertSelectKey(boardVO);
return boardVO.getBno();
}
(...생략...)
}
package org.zerock.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardServiceTest {
@Autowired
private BoardService boardService;
(...생략...)
@Test
public void testRegister() {
BoardVO boardVO = new BoardVO();
boardVO.setTitle("testRegister() title test");
boardVO.setContent("testRegister() content test");
boardVO.setWriter("testRegister() writer test");
long bno = boardService.register(boardVO);
log.info(bno);
}
}
프레젠테이션(웹) 계층의 CRUD 구현
웹 계층의 구현
- 웹 계층에서 가정 먼저 설계하는 것은 URI의 설계
- 기준? → 와이어프레임, 스토리보드
Task | URL | Method | Parameter | From | URL 이동 |
전체 목록 | /board/list | get | |||
등록처리 | /board/register | post | 모든 항목 | 입력화면 필요 | 이동 |
조회 | /board/get | get | bno=n | ||
삭제 처리 | /board/remove | post | bno | 입력화면 필요 | |
수정 처리 | /board/modify | post | 모든 항목 | 입력화면 필요 | 이동 |
작업의 순서
- 목록페이지 : 모든 진입 경로인 동시에 입력을 가는 링크
- 등록 입력/처리 : 게시물 등록 및 처리, 처리 후 이동
- 조회 : 목록 페이지에서 특정 게시물로 이동
- 수정/삭제 : 조회 페이지에서 수정/삭제 선택해 처리
Controller 목록 처리
- 게시물(BoardVO)의 목록을 Model에 담아서 전달
- Model 전달 당시에는 없는데 화면에서 추가적인 데이터가 필요한 경우
package org.zerock.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;
@Controller
@Log4j
@RequestMapping("/board/*")
@RequiredArgsConstructor
public class BoardController {
@GetMapping("/list")
public void list() {
log.info("BoardController list()");
}
}
package org.zerock.controller;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration // Test for Controller
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/root-context.xml", "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
@Log4j
public class BoardControllerTest {
@Setter(onMethod_ = {@Autowired})
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void testList() throws Exception{
log.info(
mockMvc.perform(
MockMvcRequestBuilders.get("/board/list"))
.andReturn()
.getModelAndView()
.getModelMap());
}
}
728x90
'organize > 스프링' 카테고리의 다른 글
스프링 웹 프로젝트 11 (0) | 2025.01.09 |
---|---|
스프링 웹 프로젝트 10 (0) | 2025.01.08 |
스프링 웹 프로젝트 8 (0) | 2025.01.06 |
스프링 웹 프로젝트 7 (0) | 2025.01.05 |
스프링 웹 프로젝트 6 (0) | 2025.01.04 |