MVC(Model-View-Controller) 패턴


1. MVC(Model-View-Controller) 패턴

  • MVC 패턴은 디자인 패턴 중 하나로 데이터 처리(Model), 클라이언트가 보는 페이지(View), 그리고 중간에서 이들을 제어하는 컨트롤러(Controller)로 역할을 분담해 설계하는 디자인 패턴
  • MVC 패턴을 활용하게 되면 각각 정해진 역할에만 집중하기 때문에 유지 보수 및 확장성이 용이한 장점이 있지만 설계하는 시간과 개발 시간이 증가하는 단점이 존재

2. Model (.class)

  • 비즈니스 영역의 로직 처리와 데이터 처리 부분을 담당
    • VO(Value Object), DTO(Data Transfer Object)는 계층 간 데이터 교환을 위한 용도의 객체
    • DAO(Data Access Object)는 Data에 접근하기 위한 용도의 객체
    • Service는 전달할 데이터들을 가공하고 비즈니스 로직을 처리하기 위한 용도의 객체

3. View (.jsp)

  • 사용자 인터페이스 부분을 담당
  • 주로 모델(Model)로부터 전달받은 데이터들을 사용자에게 보여주는 역할

4. Controller (Servlet)

  • 뷰(View)와 모델(Model), 모델(Model)과 뷰(View)를 제어하는 부분을 담당
  • 뷰(View)를 통해 사용자가 입력한 값을 전달받거나 모델(Model)로부터 처리된 데이터를 뷰(View)로 전달하는 역할

 

 

JDBC(Java DataBase Connectivity)


1. JDBC(Java DataBase Connectivity)

  • 자바에서 데이터베이스에 접근할 수 있게 해주는 표준 Programming API
  • 자바와 데이터베이스 연결 시 사용하는 DBMS에 알맞은 JDBC 드라이버를 사용해야 함
  • JDBC 드라이버를 사용하면 DBMS의 종류 상관없이 동일한 방법으로 데이터베이스에 다양한 작업 가능

 

2. JDBC 주요 객체

2.1. DriverManager

  • DriverManager 클래스는 JDBC 드라이버를 통하여 Connection을 만드는 역할을 한다.
  • Class.forName() 메소드를 이용해서 JDBC 드라이버를 등록하면 드라이버 내부에 있는 클래스들을 동적으로 로드
Class.forName("org.mariadb.jdbc.Driver"); // MariaDB
Class.forName("oracle.jdbc.driver.OracleDriver"); // 오라클
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // MSSQL

2.2. Connection

  • DriverManager 클래스를 통해 실제 데이터베이스와 연결된 Connection 객체를 얻을 수 있음
  • Connection 객체는 직접 생성이 불가능하고 DriverManager.getConnection() 메소드를 호출하여 Connection 객체를 얻어올 수 있음
Connection connection = DriverManager.getConnection("jdbc:mariadb://localhost:3306/web", "web", "web");

2.3. Statement

  • Connection 객체를 통해 데이터베이스에 SQL 구문을 전달하여 실행시키고 결과를 반환받는 역할을 하는 객체
  • Statement 객체는 직접 생성이 불가능하고 Connection 객체의 createStatement() 메소드를 호출하여 Statement 객체를 생성 가능
Statement stmt = connection.createStatement();
  • SQL 구문의 종류에 따라 실행에 필요한 메소드가 달라짐
// SELECT 쿼리 실행 (ResultSet 객체를 리턴한다.)
ResultSet rs = stmt.executeQuery("SELECT * FROM emp");

// INSERT, UPDATE, DELETE 쿼리 실행 (정수값을 리턴한다.)
int result = stmt.executeUpdate("DELETE FROM emp WHERE emp_no = 10")

2.4. PreparedStatement

  • SQL 구문을 미리 컴파일 하고 실행 시간 동안 인수 값을 위한 공간을 확보한다는 점에서 Statement와 다
  • PreparedStatement 객체는 직접 생성이 불가능하고 Connection 객체의 prepareStatement() 메소드를 호출하여 PreparedStatement 객체를 생성 가능
String query = "SELECT * FROM emp WHERE emp_no = ?";
PreparedStatement pstmt = connection.prepareStatement(query);

pstmt.setInt(1, 10);

ResultSet rs = pstmt.executeQuery();

2.5. ResultSet

  • ResultSet 객체는 SELECT 쿼리의 실행 결과에 의해 생성된 테이블(Result Set)을 담고 있으며 커서(cursor)로 조회된 행들의 데이터에 접근 가능
ResultSet rs = stmt.executeQuery("SELECT * FROM emp");

while(rs.next()){
  System.out.println(rs.getInt("emp_no") + ", " + rs.getString(2));
}

'servlet-jsp' 카테고리의 다른 글

[Servlet-JSP] 서블릿(Servlet)  (0) 2024.07.01

서블릿(Servlet)


1. 애플릿(Applet)

  • 웹 브라우저에서 실행되는 자바 응용프로그램으로 서버에서 클라이언트 쪽으로 실행 파일을 내려받아서 실행되는 방식
  • 현재는 HTML5, CSS3, JavaScript 등의 기술들의 발전으로 애플릿을 사용하고 있지 않음

 

2. 서블릿

  • Server Side Applet으로 자바 언어로 구현되는 서버 프로그램
  • 서블릿은 웹 브라우저로부터 요청을 받아 처리하고 결과를 다시 웹 브라우저로 전송하는 역할
  • 일반적인 자바 클래스와 다르게 javax.servlet.http.HttpServlet 클래스를 상속해야 함
  • HttpServlet 클래스는 서블릿이 웹상에서 HTTP 프로토콜을 이용해 서비스를 처리하기 위해 반드시 상속해야 하는 클래스
public class 클래스명 extends HttpServlet {
  ...
}

 

3.서블릿 메소드

3.1. doGet()

  • 클라이언트에서 GET 방식으로 요청이 전송될 경우 호출되는 메소드
    • 데이터를 요청할 때, url(Query String)에 포함해서 보내는 방식
    • head에 데이터를 포함
    • 보안적으로 취약하며, 길이의 제한이 있음
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
  // GET 요청에 응답할 로직을 구현
}

3.2. doPost()

  • 클라이언트에서 POST 방식으로 요청이 전송될 경우 호출되는 메소드
    • 데이터를 요청할 때, body에 포함해서 보내는 방식
    • 데이터가 url에 보이지 않기 때문에 보안에 취약하지 않
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
  // POST 요청에 응답할 로직을 구현
}

 

4. 요청 객체와 응답 객체

4.1. HttpServletRequest

  • 클라이언트(웹 브라우저)에서 서버에 보내는 요청 정보를 제공하는 객체
  • javax.servlet.ServletRequest를 상속
  • 주요 메소드

4.2 HttpServletResponse

  • 서버가 클라이언트(웹 브라우저)로 보내는 응답 정보를 처리하는 객체이다.
  • javax.servlet.ServletResponse를 상속한다.
  • 주요 메소드

 

5. 서블릿 동작 구조

  • 클라이언트가 웹 브라우저를 통해 요청을 보냄
  • 해당 요청이 서블릿에 대한 요청이면 서블릿 컨테이너에게 처리를 넘김
  • 서블릿에서 요청에 대한 실행이 완료된 후에는 서블릿 컨테이너가 실행 결과를 웹서버에 전달
  • 웹서버는 서비스를 요청한 클라이언트에 응답
  • 컨테이너의 서블릿에 대한 설정은 배표 서술자(web.xml)에 작성
  • 정적인 요소는 Web Server에서 처리하고 동적인 요소는 WAS에서 처리하는 것이 일반

 

6. 서블릿 생명주기

  • 첫 번째 요청일 경우, 서블릿 객체를 생성하고 init() 메소드를 호출
    • 이후 요청에 대해서는 서블릿 객체 생성, init()메소드는 호출하지 않음
  • 다음에 service() 메소드가 클라이언트 요청 방식에 따라 doGet() 또는 doPost() 메소드를 호출
  • 최종적으로 서블릿이 서비스되지 않았을 때 destroy() 메소드를 호출
    • destroy() 메소드는 보통 서버가 종료되었을 때, 서블릿의 내용이 변경되어 재 컴파일 될 때 호출

 

7. 배포 서술자 (Deployment Descriptor)

  • 배포 서술자(Deployment Descriptor)는 애플리케이션에 대한 전체 설정 정보를 가지고 있는 파일
  • 배포 서술자의 정보를 가지고 웹 컨테이너가 서블릿 구동
  • 웹 애플리케이션 폴더의 WEB-INF 폴더에 web.xml 파일이 배포 서술자
  • 설정 정보
    • Servlet 정의, Servlet 초기화 파라미터
    • Session 설정 파라미터
    • Servlet/JSP 매핑, MIME type 매핑
    • 보안 설정
    • Welcome file list 설정
    • 에러 페이지 리스트, 리소스, 환경 변수

 

8. 서블릿 매핑

  • 사용자의 요청을 서블릿에게 전달하기 위해서는 서블릿을 등록하고 매핑해야 함
  • 서블릿을 등록하고 매핑하는 방법은 web.xml과 @annotation을 이용하는 방법이 있음
<servlet>
   <servlet-name>서블릿 이름</servlet-name>
   <servlet-class>서블릿 클래스</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>서블릿 이름</servlet-name>
    <url-pattern>접근 URL 패턴</url-pattern>
</servlet-mapping>
@WebServlet("접근 URL 패턴")
public class 서블릿이름 extends HttpServlet{
  // servlet code
}

+ Recent posts