웹 어플리케이션 구조 – 서비스~DAO 구조

웹 어플리케이션 개발할 때 가장 많이 사용되는 구조로 컨트롤러-서비스-DAO로 이어지는 구성이다.

모델 데이터베이스 테이블과 관련된 클래스가 위치한다. CRUD의 기본단위로 사용되며, 서비스-DAO 간 데이터를 주고 받기 위한 객체로도 사용된다.
DAO Data Access Object의 약자로 데이터베이스 테이블에 대한 CRUD 기능을 정의한다. 데이터 입력이나 수정, 조회 시 데이터 타입으로 모델을 사용한다.

Service에 의해 호출되어 쿼리를 담당하는 SqlMapClienTemplate 객체를 Spring으로부터 주입받아서,
SqlMapClientTemplate객체에 쿼리 수행을 위임하고, 처리 결과를 Service에 반환한다.

SQL의 CRUD에 해당하는 insert, select, update, delete 메소드를 정의한다.
DAO인터페이스는 조회 기준이 되는 테이블마다 1개를 작성하는 것이 일반적이다.

서비스 컨트롤러를 통해서 전달받은 사용자의 요청을 구현한다. DB연산이 필요한 경우 DAO를 이용한다.

Controller에 의해 호출되어 실제 비즈니스 로직과 트랜잭션을 처리하고, DB CRUD를 담당하는 DAO 객체를 Spring으로부터 주입 받아서, DAO에 DB CRUD처리를 위임하고 처리결과를 Controller에게 반환한다.

컨트롤러 사용자의 웹 요청을 받아 서비스나 DAO에 전달하고, 결과를 뷰에 전달한다.

HttpServletRequest를 이용한 요청 파라미터 구하기

@RequestMapping 메소드에  HttpServletRequest 타입의 인자를 추가한 뒤,  getParameter()메소드를 이용해서 HTTP 요청 파라미터를 구하면 된다.

@Controller
	public class EventController {
	
	@RequestMapping(value="/event/create", method=RequestMethod.POST) //value = 경로 , method = HTTP전송방식
	public String list(HttpServletRequest request, Model model) throws IOException{ 
               String id = request.getParameter('id');
               if(id == null) return "member/registered";
	}
}

컨트롤러 구현

컨트롤러를 구현한다는 것은 클라이언트의 요청을 처리할 메소드를 구현한다는 것을 뜻한다.

과정은 다음과 같다.
1. @Controller 어노테이션을 클래스에 적용한다.
2. @RequestMapping 어노테이션을 이용해서 처리할 요청 경로를 지정한다.
3. 웹 브라우저의 요청을 처리할 메소드를 구현하고, 뷰 이름을 리턴한다.

++모델++
뷰에서 결과를 보여줄 때 필요한 데이터를 전달하기 위해 사용하는 것이 바로 모델이다.
컨트롤러는 뷰에서 필요로 하는 데이터를 모델에 담아서 전달하고, 뷰는 결과를 생성하는데 필요한 데이터를 모델에서 가져와 사용하게 된다.
컨트롤러는 다양한 방식으로 모델에 뎅터를 담을 수 있는데,
가장 간단한 방법은 Model을 파라미터로 추가하고, Model 파라미터에 데이터를 추가하는 것이다.

Model addAllAttribute(String attrName, Object attrValue)
: 이름이 attrname이고 값이 attrValue인 모델 속성을 추가한다.

Model addAllAttributes(Map<String,?> attributes)
: 맵의 <키, 값> 쌍들을 모델 속성 이름과 값으로 추가한다.

ModelMap 클래스는 Model 인터페이스와 동일한 메소드를 제공하고 있기 때문에, addAtribute()등의 메소드를 그대로 사용할 수 있다.

@RequestMaping을 이용한 요청 매핑

@RequestMapping 어노테이션 : 클라이언트는URL로 요청을 전송하는데, 요청 URL을 어떤 메소드가 처리할지 여부를 결정하는 역할을 한다.
컨트롤러와 메소드에 @RequestMapping 어노테이션을 모두 사용하면, 클래스에 적용한 값과 메소드에 적용한 값을 조합해서 매핑될 경로를 결정한다.
클래스에 @RequestMapping 어노테잇ㄴ을 적용하는 것은 컨트롤러 클래스가 특정 경로를 기준으로 그 하위 경로만을 처리한다는 것을 의미한다.

@Controller
	public class EventController {
	
	@RequestMapping(value="/event/create", method=RequestMethod.POST) //value = 경로 , method = HTTP전송방식
	public String regist(Model model){ //데이터를 담아 뷰에 전달하기위해 Model을 파라미터로 추가.
		
		List<Event> eventList = getOpenedEventList();
		model.addAttribute('eventList', eventList); //데이터를 담아 뷰에 전달하기위해 Model파라미터에 데이터추가
		
		return "member/registered";
	}
}