728x90
서비스 레이어
주로 비즈니스 로직을 포함하고 있는 계층을 말하며, 이 계층은 인터페이스와 구현 클래스로 구성될 수 있음
인터페이스에서는 추상 메소드로 비즈니스 로직의 틀을 제공하며, 실제 구현은 클래스에서 작성함
FrontController 패턴에서의 DAO
- FrontController 가 DAO를 직접 이용하였음
- 이의 단점은 결합도가 높기 때문에 유지보수에 불리함
따라서 Controller와 DAO 사이에 Service Interface를 생성하면 Controller가 직접 DAO를 사용하는 것이 아닌 Service가 DAO를 사용하는 방식으로 바뀌기 때문에 결합도가 낮아지고 유지보수가 유리해진다
그 이유는 Service 가 Interface 를 멤버변수(의존 관계)로 가지고 있으면, @만 어떤 클래스에 설정하는 지에 따라 다른 객체들을 주입 받을 수 있다. 즉, 코드가 바뀌지 않아 결합도가 낮아지고 유지보수가 용이해지는 것이다
Q. 그럼 인터페이스가 왜 중요할까 ?
메소드 강제성을 부여함으로써 실수할 확률이 적어지며, 반드시 구현해야 할 메소드들을 빼놓지 않고 구현할 수 있음
다형성(오버라이딩)을 실현하기에 좋음
실습
서비스 레이어를 활용하여 Controller가 Service를 통하여 DAO를 사용하도록 하기 (Spring MVC 패턴)
> interface 생성
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);
}
> interface의 추상 메소드를 강제 받기 위한 클래스 생성
BoardService.java
@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);
}
}
> DAO interface 생성
InterfaceBoardDAO.java
public interface InterfaceBoardDAO {
List<BoardDTO> selectAll(BoardDTO bDTO);
BoardDTO selectOne(BoardDTO bDTO);
boolean insert(BoardDTO bDTO);
boolean update(BoardDTO bDTO);
boolean delete(BoardDTO bDTO);
}
> InterfaceDAO를 상속받을 DAO를 생성
BoardDAO.java
@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=?";
public List<BoardDTO> selectAll(BoardDTO bDTO) {
return jdbcTemplate.query(SELECTALL, new BeanPropertyRowMapper<BoardDTO>(BoardDTO.class));
}
public BoardDTO selectOne(BoardDTO bDTO) {
Object[] args= { bDTO.getBid() };
return jdbcTemplate.queryForObject(SELECTONE, args, new BeanPropertyRowMapper<BoardDTO>(BoardDTO.class));
}
public boolean insert(BoardDTO bDTO) {
int result=jdbcTemplate.update(INSERT, bDTO.getMid(), bDTO.getContent());
return result>0 ? true : false;
}
public boolean update(BoardDTO bDTO) {
int result=jdbcTemplate.update(UPDATE, bDTO.getContent(), bDTO.getBid());
return result>0 ? true : false;
}
public boolean delete(BoardDTO bDTO) {
int result=jdbcTemplate.update(DELETE, bDTO.getBid());
return result>0 ? true : false;
}
}
> Controller에 의존 주입할 멤버 변수 생성
CTRL.java
@Controller
public class CTRL {
@Autowired
private InterfaceBoardService boardService;
@GetMapping("/")
public String root(Model model) {
model.addAttribute("datas", boardService.selectAll(null));
return "main";
}
// .. (생략)
}
위의 실습과 같이 Service 레이어를 사용하게 되면 기존의 DAO를 직접 사용하는 것이 아닌 Service를 통해 DAO를 사용하는 로직이 된다
728x90
'Spring Boot' 카테고리의 다른 글
| [Spring Boot] MyBatis 프레임워크 (0) | 2023.09.25 |
|---|---|
| [Spring Boot] GetMapping, PostMapping 어노테이션 (2) | 2023.09.20 |
| [Spring Boot] 예외 처리 미루기 (MVC 패턴) (2) | 2023.09.20 |
| [Spring Boot] DB 연결 방법 (0) | 2023.09.18 |
| [Spring Boot] 데이터 유효성 검사 (2) | 2023.09.15 |