Spring Framework는 다양한 웹 애플리케이션 개발을 지원하는 강력한 도구입니다.
특히, @Controller
, @Service
, @Repository
등의 어노테이션을 사용하여 웹 애플리케이션의 각 계층을 명확하게 구분할 수 있습니다.
이 글에서는 Spring의 Redirect, Request, Response 처리 방법과 서비스 계층 구현에 대해 깊이 있게 다뤄보고, 이를 실제 예시와 함께 설명합니다.
1. Spring에서 Controller 및 요청 처리
Spring MVC에서는 @Controller
어노테이션을 사용하여 웹 애플리케이션의 요청을 처리하는 컨트롤러 클래스를 정의합니다. 이 클래스는 클라이언트의 요청을 받고, 적절한 서비스 로직을 처리한 후 뷰(View)로 데이터를 전달하는 역할을 합니다.
예시: ScoreController
클래스
@Controller
@RequestMapping("/service")
public class ScoreController {
@Autowired
@Qualifier("x")
private ScoreService scoreService;
@RequestMapping("/scoreList")
public String scoreList(Model model) {
model.addAttribute("list", scoreService.getScore());
return "service/scoreList";
}
@RequestMapping("/scoreRegist")
public String scoreRegist() {
return "service/scoreRegist";
}
@RequestMapping("/scoreResult")
public String scoreResult() {
return "service/scoreResult";
}
@RequestMapping("/scoreForm")
public String scoreForm(ScoreVO vo) {
scoreService.regist(vo);
return "redirect:/service/scoreList";
}
}
설명:
@Controller
: 이 클래스가 Spring MVC에서 HTTP 요청을 처리하는 컨트롤러임을 나타냅니다.@RequestMapping("/service")
: 클래스 레벨에서/service
로 시작하는 요청을 처리합니다.@Autowired
와@Qualifier("x")
:ScoreService
를 주입받습니다.@Qualifier
는 빈 이름을 지정하는데 사용됩니다.- 각 메서드는
Model
객체를 통해 데이터를 전달하거나, 리다이렉트(redirect:
)를 통해 다른 URL로 이동하는 기능을 제공합니다.
핵심 포인트:
@RequestMapping
어노테이션으로 경로와 메서드를 매핑하여 URL을 처리합니다.redirect:
는 요청 후 다른 경로로 리다이렉트할 때 사용됩니다.
2. 서비스 계층과 의존성 주입
Spring에서는 서비스 계층을 @Service
어노테이션으로 정의하고, 해당 서비스가 필요한 DAO(Data Access Object)나 다른 컴포넌트를 @Autowired
및 @Qualifier
를 사용하여 주입받습니다.
예시: ScoreServiceImpl
클래스
@Service("x")
public class ScoreServiceImpl implements ScoreService {
@Autowired
@Qualifier("y")
private ScoreDAO scoreDAO;
@Override
public void regist(ScoreVO vo) {
System.out.println("Service layer: " + vo);
scoreDAO.regist(vo);
}
@Override
public ArrayList<ScoreVO> getScore() {
return scoreDAO.getScore();
}
}
설명:
@Service("x")
:ScoreServiceImpl
은 서비스 빈으로 등록되며, 빈 이름을 "x"로 지정합니다.@Autowired
와@Qualifier("y")
:ScoreDAO
의 빈을 주입받을 때, "y"라는 이름을 가진 빈을 선택합니다.
핵심 포인트:
@Autowired
: Spring의 의존성 주입 기능을 통해 다른 빈을 자동으로 주입받습니다.@Qualifier
: 여러 개의 빈이 존재할 경우, 특정 빈을 지정하여 주입할 수 있습니다.
3. DAO 계층: 데이터 접근 로직
DAO
계층은 데이터베이스와 상호작용하여 데이터를 저장하거나 조회하는 역할을 합니다. Spring에서는 @Repository
어노테이션을 사용하여 DAO 클래스를 정의하고, 이를 Spring 컨텍스트에 빈으로 등록합니다.
예시: ScoreDAOImpl
클래스
@Repository("y")
public class ScoreDAOImpl implements ScoreDAO {
private List<ScoreVO> list = new ArrayList<>();
@Override
public void regist(ScoreVO vo) {
list.add(vo);
}
@Override
public ArrayList<ScoreVO> getScore() {
return new ArrayList<>(list);
}
}
설명:
@Repository("y")
:ScoreDAOImpl
은ScoreDAO
인터페이스를 구현한 DAO 클래스로, 빈 이름을 "y"로 지정합니다.regist
메서드:ScoreVO
객체를 리스트에 저장합니다.getScore
메서드: 저장된 점수 목록을 반환합니다.
핵심 포인트:
@Repository
: 데이터베이스와의 상호작용을 담당하는 빈을 정의합니다.- Spring은
@Repository
어노테이션을 통해 데이터베이스 관련 예외를 자동으로 변환해줍니다.
4. Spring에서 요청과 응답 처리: @RequestParam
, HttpServletRequest
Spring에서는 HTTP 요청 파라미터를 다양한 방식으로 처리할 수 있습니다. @RequestParam
, @ModelAttribute
, HttpServletRequest
등을 사용하여 파라미터를 매핑하고, 데이터를 처리합니다.
예시: RequestController
클래스
@Controller
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/req_ex01")
public String ex01() {
return "request/req_ex01";
}
@RequestMapping("/param")
public void param(HttpServletRequest request) {
String id = request.getParameter("id");
String pw = request.getParameter("pw");
System.out.println("id: " + id + ", pw: " + pw);
}
@RequestMapping("/param2")
public String param2(@RequestParam("id") String id,
@RequestParam("pw") String pw) {
System.out.println("id: " + id + ", pw: " + pw);
return "request/req_ex02";
}
}
설명:
HttpServletRequest
: 요청 파라미터를 직접 가져와 처리하는 방법입니다.@RequestParam
: 특정 파라미터를 메서드 인자로 매핑하여 처리하는 방법입니다.
핵심 포인트:
@RequestParam
을 사용하면 요청 파라미터를 메서드 인자로 직접 매핑할 수 있습니다.HttpServletRequest
를 사용하면 더 세밀하게 요청 파라미터를 제어할 수 있습니다.
5. 리다이렉트와 RedirectAttributes
Spring에서는 요청을 처리한 후 다른 경로로 리다이렉트할 수 있습니다. 리다이렉트를 할 때는 RedirectAttributes
를 사용하여 데이터를 전달할 수 있습니다.
예시: RedirectController
클래스
@Controller
@RequestMapping("/response")
public class ResponseController {
@RequestMapping("/loginForm")
public String loginForm() {
return "response/loginForm";
}
@RequestMapping("/loginFormSubmit")
public String loginFormSubmit(MemberVO vo, RedirectAttributes ra) {
if (vo.getId().equals("admin") && vo.getPassword().equals("1234")) {
return "redirect:/home";
} else {
ra.addFlashAttribute("error", "Invalid credentials");
return "redirect:/response/loginForm";
}
}
}
설명:
RedirectAttributes
: 리다이렉트 후 데이터를 전달하는데 사용됩니다.addFlashAttribute
: 데이터를 일시적으로 저장하여 리다이렉트 후 뷰에서 접근할 수 있도록 합니다.
핵심 포인트:
RedirectAttributes
는 리다이렉트 후, 메시지나 데이터를 전달할 수 있게 도와줍니다.addFlashAttribute
: 리다이렉트가 일어난 후에도 데이터를 일시적으로 유지할 수 있습니다.
Spring Framework는 Request, Response, Redirect 처리를 효율적으로 지원하며, 서비스 계층과 DAO 계층을 명확하게 분리하여 개발할 수 있도록 돕습니다. 이 포스팅에서 다룬 @Controller
, @Service
, @Repository
등의 어노테이션은 각 계층의 역할을 명확하게 정의하고, 의존성 주입을 통해 서로 다른 계층 간의 연동을 원활하게 처리할 수 있게 합니다.
'🗄️ Backend > Spring' 카테고리의 다른 글
Spring Boot 기초: 웹 애플리케이션 설정 (0) | 2024.11.10 |
---|---|
HikariCP, MyBatis를 활용한 데이터베이스 연결 풀 설정 및 최적화 (1) | 2024.11.10 |
스프링 프레임워크(Spring Framework) 기본 개념과 활용 (3) | 2024.11.09 |