간단한 웹 어플리케이션 구성요소
- 프론트 서블릿
- 컨트롤러 + 뷰
- 서비스
- DAO
프론트 서블릿: 웹 브라우저의 모든 요청을 받는 창구 역할을 하며, 요청을 분석해서 알맞은 컨트롤러에 전달한다. 스프링 MVC에서는 DispatcherServlet이 프론트 서블릿의 역할을 수행한다.
컨트롤러: 실제 웹 브라우저의 요청을 처리한다. 컨트롤러는 클라이언트(브라우저)의 요청을 처리하기 위해 알맞은 기능을 실행하고 그 결과를 뷰에 전달한다. 컨트롤러의 주요 역할은 다음과 같다.
- 클라이언트가 요구한 기능을 실행
- 응답 결과를 생성하는데 필요한 모델 생성
- 응답 결과를 생성할 뷰 선택
서비스: 기능의 로직을 구현한다. 사용자에게 비밀번호 변경 기능을 제공하려면 수정 폼을 제공하고, 로그인 여부를 확인하고, 실제로 비밀번호를 변경해야 한다.
DAO: DB연동이 필요하면 사용한다 DAO는 Data Access Object의 약자로서 DB와 웹 어플리케이션 간에 데이터를 이동시켜 주는 역할을 맡는다. 어플리케이션은 DAO를 통해서 DB에 데이터를 추가하거나 DB에서 데이터를 읽어온다.
서비스의 구현
서비스는 핵심이 되는 기능의 로직을 제공한다고 했다. 예를 들어 비밀번호 변경 기능은 다음 로직을 서비스에서 수행한다.
- DB에서 비밀번호를 변경할 회원의 데이터를 구한다
- 존재하지 않으면 익셉션을 발생시킨다.
- 회원 데이터의 비밀번호를 변경한다.
- 변경 내역을 DB에 반영한다.
서비스 메서드는 트랜잭션 범위에서 실행한다. 비밀번호 변경 기능도 디음과 같이 스프링의@Transactional을 이용해서 트랜잭션 범위에서 비밀번호 변경 기능을 수행했다.
@Transactional
public void changePassword(String email, String oldPwd, String newPwd) {
Member member = memberDao.selectByEmail(email);
if (member == null)
throw new MemberNotFoundException();
member.changePassword(oldPwd, newPwd);
memberDao.update(member);
}
같은 데이터를 시용하는 기능들을 한 개의 서비스에 모아서 구현할 수도 있다. 예를 들어 회원 가입 기능과 비밀번호 변경 기능은 모두 회원에 대한 기능이므로 다음과 같이 MemberService라는 클래스를 만들어서 회원과 관련된 모든 기능을 제공하도록 구현할 수 있을 것이다.
public class MemberService {
@Transactional
public void regist(RegisterRequest req) { … }
@Transactional
public void changePassword(String email, String oldPwd, String newPwd) { … }
}
컨트롤러에서의 DAO 접근
서비스 메서드에서 어떤 로직도 수행하지 않고 단순히 DAO의 메서드만 호출하고 끝나는 코드도 있다. 예를 들어 회원 데이터 조회를 위한 서비스 메서드를 다음과 같이 구현하곤 한다.
public class MemberService {
public Member getMember(Long id) {
return memberDao.selectByld(id);
}
}
@RequestMapping("/member/detail/{id}")
public String detail(@PathVariable("id") Long id, Model model) {
// 사실상 DAO 를 직접 호출하는 것과 동일
Member member = memberService.getMember(id):
if (member == null) {
return "member/notFound":
}
model.addAttribute("member" , member) :
return "member/memberDetail":
}
이 경우 컨트롤러는 서비스를 시용해야 한다는 압박에서 벗어나 다음과 같이 DAO에 직접 접근해도 큰 틀에서 웹 어플리케이션의 계층 구조는 유지된다고 본다.
서비스에 비즈니스 로직을 넣는다면 트랜잭션 스크립트패턴이라 부르고, 도메인 부분에 비즈니스로직을 넣는다면 도메인 모델 패턴이라 부른다.
패키지 구성
기능 제공 영역은 밑의 그림처럼 service, dao, model과 같은 세부 패키지로 구분하기도한다.
Reference
초보 웹개발자를 위한 스프링5 프로그래밍 입문
'Spring > 스프링5 프로그래밍 입문' 카테고리의 다른 글
Chapter 17. 프로필과 프로퍼티 파일 (0) | 2023.04.14 |
---|---|
Chapter 16. JSON 응답과 요청 처리 (0) | 2023.04.13 |
Chapter 14. MVC 4: 날짜 값 변환, @PathVariable, 익셉션 처리 (0) | 2023.04.11 |
Chapter 13. 세션, 인터셉터, 쿠키 (0) | 2023.04.10 |
Chapter12. MVC 2: 메시지, 커맨드 객체 검증 (0) | 2023.04.07 |