프로그래밍

[SpringBoot] day93 : Service와 Interface 본문

자바/Spring Boot

[SpringBoot] day93 : Service와 Interface

시케 2023. 9. 21. 16:18
728x90
반응형

2023.09.21.목

Service와 Interface

기존 Spring에서도 서비스 레이어 방식(2-Layerd방식)을 사용하여 구현한 바가 있다
 
직접 객체를 사용하게 되면 결합도가 높아져 유지보수에 불리해지게 된다
그래서 컨트롤러에서 직접 객체를 사용하지 않고
컨트롤러와 DAO 사이에 서비스 레이어를 끼워넣어 사용하는 것이다
※ 코드 변경이 잦게 되면 결합도가 높아진다

더보기

Service가 DAO를 활용하는 형태

Service 메서드() {
	aDAO.insert();// 현금 결제
	bDAO.update();// 아이템 구입
} // 1개의 행동 == 1개의 트랜잭션

 

2023.08.12 - [Spring] - [Spring] day60 : Service와 ServiceImplement(+@Repository)

[Spring] day60 : Service와 ServiceImplement(+@Repository)

2023.08.02.수 Service와 ServiceImplement @Repository @Repository는 @Component를 상속받는다 다만 Model 파트에서 사용하기에 관점분리에 유리하며 메모리 관리에 유리하며 속도가 향상된다 "DAO"라고 이름이 붙지

dev-9rm.tistory.com

2023.08.14 - [Spring] - [Spring] day64 : 2-Layerd 아키텍처 스타일

[Spring] day64 : 2-Layerd 아키텍처 스타일

2023.08.08.화 2-Layerd 아키텍처 스타일 : 표현 계층과 비즈니스(핵심) 계층의 통합 : 프레젠테이션 레이어와 비즈니스 레이어의 통합 현재의 프로그램 작동 방식은 다음과 같다 1) 브라우저(Client, 사

dev-9rm.tistory.com

구조

우리는 인터페이스를 사용하여 구현할 것이다
Service가 Interface를 멤버변수로 가지고 있으면
(의존관계로 가지고 있으면)
어노테이션만 클래스에 다르게 설정하는지에 따라 다른 객체를 주입 받을 수 있게 된다
즉, 코드의 변경이 적어져 결합도가 낮아지고 유지보수가 용이해진다

Service는 DAO를 사용한다
Service와 DAO는 각각 Interface를 활용하여 구현한다

코드 구현

InterfaceBoardDAO.java

public interface InterfaceBoardDAO {
	public List<BoardDTO> selectAll(BoardDTO bDTO);
	public BoardDTO selectOne(BoardDTO bDTO);
	public boolean insert(BoardDTO bDTO);
	public boolean update(BoardDTO bDTO);
	public boolean delete(BoardDTO bDTO);
}

BoardDAO.java

package com.jhyun.app;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class BoardDAO implements InterfaceBoardDAO{

	@Autowired
	private JdbcTemplate jdbcTemplate;

	private final String SELECTALL="SELECT * FROM BOARD ORDER BY BID DESC";
	private final String SELECTONE="SELECT * FROM BOARD WHERE BID=?";
	private final String INSERT="INSERT INTO BOARD VALUES((SELECT NVL(MAX(BID),100)+1 FROM BOARD),?,?)";
	private final String UPDATE="UPDATE BOARD SET CONTENT=? WHERE BID=?";
	private final String DELETE="DELETE FROM BOARD WHERE BID=?";

	@Override
	public List<BoardDTO> selectAll(BoardDTO bDTO) {
		return jdbcTemplate.query(SELECTALL, new BeanPropertyRowMapper<BoardDTO>(BoardDTO.class));
	}
	@Override
	public BoardDTO selectOne(BoardDTO bDTO) {
		Object[] args= { bDTO.getBid() };
		try {
			return jdbcTemplate.queryForObject(SELECTONE, args, new BeanPropertyRowMapper<BoardDTO>(BoardDTO.class));
		}
		catch(Exception e) {
			return null;
		}
	}
	@Override
	public boolean insert(BoardDTO bDTO) {
		int result=jdbcTemplate.update(INSERT, bDTO.getMid(), bDTO.getContent());
		return result>0 ? true : false;
	}
	@Override
	public boolean update(BoardDTO bDTO) {
		int result=jdbcTemplate.update(UPDATE, bDTO.getContent(), bDTO.getBid());
		return result>0 ? true : false;
	}
	@Override
	public boolean delete(BoardDTO bDTO) {
		int result=jdbcTemplate.update(DELETE, bDTO.getBid());
		return result>0 ? true : false;
	}

}

InterfaceBoardService.java

public interface InterfaceBoardService {
	List<BoardDTO> selectAll(BoardDTO bDTO);
	BoardDTO selectOne(BoardDTO bDTO);
	boolean insert(BoardDTO bDTO);
	boolean update(BoardDTO bDTO);
	boolean delete(BoardDTO bDTO);
}

BoardService.java

package com.jhyun.app;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BoardService implements InterfaceBoardService {

	@Autowired
	private InterfaceBoardDAO bDAO;
	
	@Override
	public List<BoardDTO> selectAll(BoardDTO bDTO) {
		return bDAO.selectAll(bDTO);
	}

	@Override
	public BoardDTO selectOne(BoardDTO bDTO) {
		return bDAO.selectOne(bDTO);
	}

	@Override
	public boolean insert(BoardDTO bDTO) {
		return bDAO.insert(bDTO);
	}

	@Override
	public boolean update(BoardDTO bDTO) {
		return bDAO.update(bDTO);
	}

	@Override
	public boolean delete(BoardDTO bDTO) {
		return bDAO.delete(bDTO);
	}

}

CTRL.java

package com.jhyun.app;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import jakarta.servlet.http.HttpSession;

@Controller
public class CTRL {

	@Autowired
	private InterfaceBoardService boardService;
	@Autowired
	private InterfaceMemberService memberService;

	@GetMapping("/")
	public String root(Model model) {
		model.addAttribute("datas", boardService.selectAll(null));
		return "main";
	}

	@PostMapping("/join")
	public String join(MemberDTO mDTO) {
		memberService.insert(mDTO);
		return "redirect:/";
	}
	@RequestMapping("/login")
	public String login(MemberDTO mDTO, HttpSession session) {
		try {
			mDTO=memberService.selectOne(mDTO); // throws 대신, error.jsp를 views 하위에 위치시켜도 ㄱㅊ
		} catch (Exception e) {
			mDTO=null;
		}
		if(mDTO!=null) {
			session.setAttribute("member", mDTO.getMid());
		}
		return "redirect:/";
	}
	@GetMapping("/logout")
	public String logout(HttpSession session) {
		session.removeAttribute("member");
		return "redirect:/";
	}
	@GetMapping("/mypage")
	public String mypage() {
		return "mypage";
	}
	@PostMapping("/mypage")
	public String mypage(MemberDTO mDTO) {
		memberService.update(mDTO);	
		return "redirect:logout";
	}
	@GetMapping("/deleteAccount/{mid}")
	public String deleteAccount(MemberDTO mDTO) {
		memberService.delete(mDTO);
		return "redirect:/logout";
	}

	@GetMapping("/insert")
	public String insert() {
		return "insert";
	}
	@PostMapping("/insert")
	public String insert(BoardDTO bDTO) {
		boardService.insert(bDTO);
		return "redirect:/";
	}
	@GetMapping("/board/{bid}")
	public String board(BoardDTO bDTO, Model model) {
		try {
			model.addAttribute("board", boardService.selectOne(bDTO)); // .selectOnt()이 예외처리를 미뤄버려서 에러발생!
		}
		catch (Exception e) {
			return "error";
			// forward  V  VR가 동작(/WEB-INF/views/ + 경로 + .jsp)
			// redirect  C
		}
		return "board";
	}
	@PostMapping("/update")
	public String update(BoardDTO bDTO) {
		System.out.println("bDTO : "+bDTO);
		boardService.update(bDTO);
		return "redirect:/board/"+bDTO.getBid();
	}
	@GetMapping("/delete/{bid}")
	public String delete(BoardDTO bDTO) {
		boardService.delete(bDTO);
		return "redirect:/";
	}

}

각각의 Service와 DAO는 의존관계가 생기므로 @Autowired 로 의존 주입을 해주었으며
@Service와 @Repository로 객체 생성을 해주었다
 

 

소스코드 보러가기
728x90
반응형
Comments