일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 데이터베이스
- 자바
- 함수
- 함수 선언
- HTML역사
- html
- DoitSQL
- R1C3
- 생성자
- DoIt
- SQL입문
- 우아한테크
- 페이지분석
- 자바 오류
- 키-값 데이터베이스
- 자바 예외
- 배열 예제
- dbms
- 숫자 형식
- 숫자형식오류
- DoitSQL입문
- 예제
- 크롤링
- 웹 브라우저 전쟁
- 크롤링 오류
- 예외
- Doit입문SQL
- 배열 3요소
- SQL
- 웹브라우저 수용도
- Today
- Total
프로그래밍
[SpringBoot] day93 : Service와 Interface 본문
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)
2023.08.14 - [Spring] - [Spring] day64 : 2-Layerd 아키텍처 스타일
구조
우리는 인터페이스를 사용하여 구현할 것이다
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로 객체 생성을 해주었다
소스코드 보러가기
'자바 > Spring Boot' 카테고리의 다른 글
[SpringBoot] day95 : MyBatis 프레임워크 (0) | 2023.09.27 |
---|---|
[Springboot] DB 연결 (0) | 2023.09.18 |
[SpringBoot] day89 : 유효성검사(Validator) (0) | 2023.09.15 |
[SpringBoot] day88 : 스프링부트 방식으로 MVC 구현(값 주고 받기) (1) | 2023.09.14 |
[SpringBoot] 스프링 VS 스프링부트(Spring VS SpringBoot) (0) | 2023.09.13 |