PLOD

[spring] spring MVC - (2.Controller) 본문

개발 공부/Spring framework

[spring] spring MVC - (2.Controller)

훌룽이 2023. 4. 17. 16:52

 

비즈니스 계층(service 계층, controller 계층)

 

비즈니스 계층은 고객의 요구사항을 반영하는 계층으로 프레젠테이션 계층과 영속 계층의 중간 다리 역할을 하게 된다. 영속 계층은 Database 기준으로 해서 설계를 나눠 구현하지만 비즈니스 계츠은 로직을 기준으로 해서 처리하게 된다. 비즈니스 계층은 Service ,ServiceImpl 클래스들을 설계하는 과정이다. 

 

Service 메서드 설계시 메서드 이름은 현실적인 로직의 이름을 붙이는 게 관례이다 . 명백하게 반환해야 할 데이터가 있는 select를 해야하는 메서드는 리턴 타입을 지정할 수 있다. 특정한 게시물을 가져오는 get() 메서드와 전체 리스트를 구하는 getList()의 경우 처음부터 리턴타입을 결정해서 진행할 수 있다. \

 

※ 기본키(primary key)와 DAO(VO)를 유의하자

mapper 메서드 service 메서드
public List<BoardVO> getList public List<BoardVO> getList
public BoardVO get public BoardVO get
public void insert(BoardVO board) public void register(BoardVO board)
public void update(Long bno) public boolean modifyLong bno)
public void delete(Long bno) public boolean remove(Long bno)

 

package org.zerock.service;

import java.util.List;

import org.zerock.domain.BoardVO;

public interface BoardService {
 
  public void register(BoardVO board);		// 조회
 
  public BoardVO get(Long bno);			// 특정게시물 상세
 
  public boolean modify(BoardVO board);		// 수정
 
  public boolean remove(Long bno);			// 삭제
 
  public List<BoardVO> getList();			// 전체 리스트
 
}

 

비즈니스 계층(컨트롤러) 에서 CRUDService 어노테이션을 이용한다 . BoardService 는 인터페이스 안에 BoardVO 클래스를 이용하는 추상메서드를 작성 한다. BoardServiceImpl는 BoardService를 구현하는 클래스로 오버라이딩을 한다.

ServiceImpl 클래스에 가장 중요한 부분은 @Service라는 어노테이션이다. @Service는 계층 구조상 주로 비즈니스 영역을 담당하는 객체임을 표시하기 위해 사용된다. 작성된 어노테이션은 패키지를 읽어 들이는 동안 처리된다. 

 

package org.zerock.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.zerock.domain.BoardVO;
import org.zerock.mapper.BoardMapper;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Log4j
@AllArgsConstructor
@Service
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardMapper mapper;
	
	@Override
	public void register(BoardVO board) {
		log.info("register......." + board);
		mapper.insertSelectKey(board);
		
	}

	@Override
	public BoardVO get(Long bno) {
		log.info("get......" + bno);
		return mapper.read(bno);
	}

	@Override
	public boolean modify(BoardVO board) {
		log.info("modify......" + board);
		return mapper.update(board) == 1;
	}

	@Override
	public boolean remove(Long bno) {
		log.info("remove......." + bno);
		return mapper.delete(bno) == 1;
	}

	@Override
	public List<BoardVO> getList() {
		log.info("getList......");
		return mapper.getList();
	}	

}

서비스 계층의 구현과 테스트를 진행한다. 원칙적으로는 서비스 계층 역시 Mapper나 DAO와 같이 별도로 테스트를 진행하는 것이 바람직하다 여기서 삭제를 test할때 void를 하지않고 boolean을 하는 이유는 엄격하게 처리하기 위해서 이다. 

package org.zerock.service;

import static org.junit.Assert.assertNotNull;

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 BoardServiceTests {
	@Autowired
	private BoardService service;
	
	
	@Test
	public void testExist() {
		log.info(service);
		assertNotNull(service);
	}
	
	@Test
	public void testRegister() {
		BoardVO board = new BoardVO();
		board.setTitle("새로 작성하는 글");
		board.setContent("새로 작성하는 내용");
		board.setWriter("newbie");
		
		service.register(board);
		
		log.info("생성된 게시물의 번호 : " + board.getBno());
	}
	
	@Test
	public void testGet() {
		log.info(service.get(1L));
	}
	
	@Test
	public void testDelete() {
		log.info("REMOVE RESULT : " + service.remove(2L));
	}
	
	@Test
	public void testUpdate() {
		BoardVO board = service.get(1L);
		
		if(board == null) {
			return;
		}
		board.setTitle("제목 수정합니다");
		log.info("MODIFY RESULT : " + service.modify(board));
	}
	
	@Test
	public void testGetList() {
		service.getList().forEach(board -> log.info(board));
	}
	
}

'개발 공부 > Spring framework' 카테고리의 다른 글

[spring] Spring dependency 설정(gradle, maven)  (0) 2023.07.08
[spring] spring MVC - (3.View)  (0) 2023.04.17
[spring] spring MVC- (1.Model)  (0) 2023.03.23
[JSP] JSP , JSTL  (0) 2023.03.09
[JSP] JDBC  (0) 2023.03.01
Comments