The Debugging Chronicles : "코드의 미학"
[Spring] 서비스 레이어 나누기 본문
생각1. DAO가 굳이 매개변수 자리에 있어야 하나?
- view에서 쓰지 않는데 굳이 인자로 삼아야할까?
생각2. 무언가를 인자로 삼으면, 결합도가 높아진다.
개발을 하면 가장 변동이 심한 것 중하나가 DBMS이다
예상 동시 이용 인원 <<< 실제 인원이 더 많다면 서버 다운...
DBMS 이관해야하면 DAO가 바뀐다.
MySQL BoradDAO
Oracle BoradOracleDAO
Maira MairaBoradDAO
DAO를 인자로 작성하면 이관작업할 떄 마다
인자를 따라 다니면서 다 바꿔야한다. ==> 유지보수가 아주 불편한 상태이다
1. DAO를 멤버변수로 위치 시킨다면??
=> 그래도 여전히 이관작업할 때 마다 코드를 변경해야함
컴파일 >> 결합도가 여전히 높음
그럼 DAO 상위 객체를 찾아보자 바로 service이다
2. service 를 멤버 변수로 위치시킴
DAO를 멤버변수로 삼고 있다는 것이 특징!
이관 작업 시 contorller.java에 변경 사항적용 안됨
의존 주입 필요
@autowired
BoardController.java
package com.koreait.app.view.board;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.koreait.app.biz.board.BoardDTO;
import com.koreait.app.biz.board.BoardService;
@Controller
public class BoardController {
@Autowired
private BoardService boardService;
@RequestMapping(value="/main.do")
public String main(BoardDTO boardDTO, Model model) {
List<BoardDTO> datas=boardService.selectAll(boardDTO);
model.addAttribute("datas", datas);
return "main";
}
@RequestMapping(value="/insertBoard.do", method=RequestMethod.GET)
public String insertBoard() {
return "insertBoard";
}
@RequestMapping(value="/insertBoard.do", method=RequestMethod.POST)
public String insertBoard(BoardDTO boardDTO) {
boolean flag=boardService.insert(boardDTO);
System.out.println("insertBoard ["+flag+"]");
return "redirect:main.do";
}
}
loginController.java
package com.koreait.app.view.member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.koreait.app.biz.member.MemberDAO;
import com.koreait.app.biz.member.MemberDTO;
import com.koreait.app.biz.member.MemberService;
import jakarta.servlet.http.HttpSession;
@Controller
public class LoginController {
@Autowired
private MemberService memberService;
@RequestMapping(value="/login.do", method=RequestMethod.GET)
public String login() {
return "login";
}
@RequestMapping(value="/login.do", method=RequestMethod.POST)
public String login(HttpSession session, MemberDAO memberDAO, MemberDTO memberDTO) {
// 커맨드 객체
memberDTO = memberService.selectOne(memberDTO);
String viewName="redirect:login.do";
if(memberDTO != null) {
session.setAttribute("userID", memberDTO.getMid());
viewName = "redirect:main.do";
}
return viewName;
}
@RequestMapping("/logout.do")
public String logout(HttpSession session) {
session.removeAttribute("userID");
return "redirect:login.do";
}
}
BoardServiceImpl.java
package com.koreait.app.biz.board;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("boardService")
public class BoardServiceImpl implements BoardService {
@Autowired
private BoardDAO boardDAO;
@Override
public List<BoardDTO> selectAll(BoardDTO boardDTO) {
return boardDAO.selectAll(boardDTO);
}
@Override
public BoardDTO selectOne(BoardDTO boardDTO) {
return boardDAO.selectOne(boardDTO);
}
@Override
public boolean insert(BoardDTO boardDTO) {
return boardDAO.insert(boardDTO);
}
@Override
public boolean update(BoardDTO boardDTO) {
return boardDAO.update(boardDTO);
}
@Override
public boolean delete(BoardDTO boardDTO) {
return boardDAO.delete(boardDTO);
}
}
BoardService.java
package com.koreait.app.biz.board;
import java.util.List;
public interface BoardService {
List<BoardDTO> selectAll(BoardDTO boardDTO);
BoardDTO selectOne(BoardDTO boardDTO);
boolean insert(BoardDTO boardDTO);
boolean update(BoardDTO boardDTO);
boolean delete(BoardDTO boardDTO);
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:component-scan base-package="com.koreait.app.view.member" />
<context:component-scan base-package="com.koreait.app.view.board" />
<context:component-scan base-package="com.koreait.app.biz.member" />
<context:component-scan base-package="com.koreait.app.biz.board" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<property name="prefix" value="./" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
'Spring' 카테고리의 다른 글
[Spring] 비동기 처리 (0) | 2024.10.14 |
---|---|
[Spring] 2-Layerd 아키텍처 (0) | 2024.10.10 |
[Spring] 2주차 (9일) 과제 핵심 포인트 (0) | 2024.10.10 |
[Spring] Command 객체 (0) | 2024.10.08 |
[Spring] 어노테이션 Controller, RequestMapping (0) | 2024.10.08 |