organize/스프링

스프링 웹 프로젝트 9

001cloudid 2025. 1. 7. 18:32
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