현재 나는 백엔드를 개발할 때 스프링부트와 JPA를 사용하고 있다.
문제는 계속 똑같은 것만 쓰다보니까 다른 방법론이나 개념들을 대부분 잊어먹었다.
그래서 이참에 다른 것들도 정리해보려고 한다.
고전적인 개념들도 포함되어 있지만 복습할 겸 해서 정리한다.
서블릿(Servlet)
JSP처럼 서버에서 동적으로 웹 페이지를 생성하는 서버 측 프로그램.
<!-- web.xml -->
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>package1.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
/test 라는 URL로 요청하면 매핑을 통해 package1.ServletTest라는 서블릿 클래스가 응답한다.
아래 예시 코드를 확인해 보자.
package package1;
public class ServletTest extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=euc-kr");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println(" <table border='1'>"); // 해줘야 테이블 형태로 나옴
out.println(" <tr>");
out.println(" <td>1000</td>");
out.println(" <td>2022년</td>");
out.println(" </tr>");
out.println(" </table>");
out.println("</body>");
out.println("</html>");
...
보다시피 자바 코드 안에 html이 들어가 있고 URL로 요청하면 이 html을 응답해준다.
MVC 패턴(Model-View-Controller Pattern)
Model은 DB 연결처럼 실질적인 로직을 관리하는 부분이다.
View는 사용자에게 표시되는 화면을 관리한다. 보통 JSP나 HTML로 구현된다.
Controller는 사용자의 요청을 받고 응답을 처리하는, 가장 바깥쪽의 요소이다.
MVC 패턴은 세 가지 종류가 있는데 MVC1, MVC2, Spring MVC이다.
MVC1은 JSP가 모델, 뷰, 컨트롤러 역할을 모두 수행하는 패턴이다. 그래서 유지보수가 힘들다.
MVC2는 JSP가 뷰의 역할만 수행하도록 한다. 컨트롤러는 서블릿을 이용한다.
Spring MVC는 DispatcherServlet을 이용한 MVC2 패턴이다. DispatcherServlet이 최상단에서 모든 요청을 받고, 그 요청을 HandlerMapping을 통해 하위 컨트롤러들에게 나눠주는 역할을 한다. 하위 컨트롤러는 @Controller 어노테이션을 사용하여 정의한다.
Model과 ModelAndView의 차이
컨트롤러에서 Model 타입(뷰 내용이 들어가 있음)을 파라미터로 요청받았다면 addAttribute로 필요한 요소의 값을 넣어서 다시 응답으로 돌려준다. Thymeleaf나 JSP로 Model을 요청한다.
public class TestController {
@Override
public String handleRequest(Model model) {
model.addAttribute("name", "doringri");
return model;
}
}
반면 ModelAndView 타입은 ModelAndView 객체를 생성한 후, addObject로 요소의 값을 넣고 setViewName을 통해 View까지 돌려준다.
public class TestController {
@Override
public ModelAndView handleRequest() {
ModelAndView mnv = new ModelAndView();
mnv.setViewName("test_view");
mnv.addObject("name", "doringri");
return mnv;
}
}
DAO 패턴(Data Access Object Pattern)
그냥 로직과 DB 액세스 로직을 분리하는 패턴이다. JPA는 알아서 DB 연결을 해 주고 레포지토리에서 쿼리까지 만들어주지만 수동으로 할 때는 직접 구현해야 한다.
public interface UserDAO {
public List<UserDTO> findAll() throws Exception;
public int delByPK(UserDTO userDto) throws Exception;
public int add(UserDTO userDto) throws Exception;
}
이런 식으로 인터페이스를 만들고 구현은 다른 클래스에서 한다.
findAll()을 구현한 부분만 아래에서 예시를 확인해보자.
public class UserDAO_MariaImpl implements UserDAO {
@Override
public List<UserDTO> findAll() throws Exception {
List<UserDTO> ls = new ArrayList<UserDTO>();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mariadb://대충 데이터베이스 URL",
"대충 id","대충 비번");
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM user ORDER BY no DESC");
while(rs.next()) {
UserDTO userDto = new UserDTO();
userDto.setNo(rs.getInt("no"));
userDto.setContent(rs.getString("content"));
ls.add(userDto);
}
}
catch(Exception e) {
throw e;
}
finally {
try {
if( rs != null ) rs.close();
if( stmt != null ) stmt.close();
if( conn != null ) conn.close();
}
catch( SQLException e ) {}
}
return ls;
}
...
}
오랜만에 예전에 짰던 코드들을 보니 새롭군요.
왜 갑자기 이런 걸 하냐면 새로 들어온 신입분이 제가 예전에 배웠던 것들을 사용하셨기 때문입니다.
제대로 기억이 안 나서 갑갑했는데 이렇게 정리해놓으니 마음이 아주 편하네요.
'IT > Spring & Spring Boot' 카테고리의 다른 글
[IT/Spring Boot] 스프링부트의 HttpSession에 대해 (0) | 2024.07.19 |
---|---|
[Spring Boot] JdbcTemplate 사용하기 (0) | 2023.11.18 |
[Spring Boot/SSL] PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException 에러 해결 (0) | 2023.10.19 |
[TDD] Junit으로 Spring Boot에서 TDD(Test-Driven Development)를 통해 로그인 기능 구현하기 (2) | 2023.06.06 |