병호의 IT새싹키우기
JSP와 MVC 패턴 Todo 프로젝트 본문
💡학습 목표💡
- MVC 패턴을 사용해 보자.
- context.xml 파일에 대한 개념을 살펴 보자.
MVC 패턴이란?
MVC (Model-View-Controller) 패턴은 소프트웨어 설계 패턴으로, 애플리케이션을 세 가지 주요 구성 요소인 모델(Model), 뷰(View), 컨트롤러(Controller)로 나누어 구현하는 방식을 말합니다. 이를 통해 코드의 재사용성과 유지보수성을 높이고, 역할과 책임을 명확히 분리하는데 목적이 있습니다.
💡소프트웨어 설계 패턴은 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위해 검증된 재사용 가능한 솔루션입니다. 설계 패턴은 객체 지향 설계 원칙을 따르며, 다양한 상황에서 사용될 수 있는 일반적인 템플릿을 제공합니다. (디자인패턴이라고도 합니다)
주요 소프트웨어 설계 패턴
- 생성 패턴 (Creational Patterns): 객체 생성 메커니즘을 제공하여 코드의 유연성을 높입니다.
- 구조 패턴 (Structural Patterns): 클래스와 객체를 조합하여 더 큰 구조를 형성합니다.
- 행위 패턴 (Behavioral Patterns): 객체 간의 상호작용과 책임 분담을 정의합니다.
그럼 MVC 패턴은 무슨 패턴일까?
MVC (Model-View-Controller) 패턴은 1979년에 트리그브 렌스카우그(Trygve Reenskaug)가 제록스 팔로 알토 리서치 센터(Xerox Palo Alto Research Center, PARC)에서 개발한 Smalltalk-80 언어에서 처음 소개되었습니다. 렌스카우그의 원래 목표는 사용자 인터페이스를 설계하는 데 있어 데이터, 비즈니스 로직, 그리고 사용자 인터페이스를 명확히 분리하는 것이었습니다. 이로 인해 시스템을 더 쉽게 이해하고 유지보수할 수 있게 되었습니다.
MVC는 구조 패턴과 행위 패턴을 결합한 복합 패턴으로 볼 수 있습니다.
MVC 패턴은 Model, View, Controller의 앞 글자를 딴 것으로 프로그램을 구성하는 요소들을 모델, 컨트롤, 뷰로 나누어 설계하는 아키텍처 패턴 중의 하나이다.
- Model (모델): 애플리케이션의 데이터와 비즈니스 로직을 관리합니다. 데이터베이스와의 상호작용을 처리하며, 데이터의 상태를 유지합니다.
- View (뷰): 사용자 인터페이스를 담당합니다. 모델의 데이터를 사용자에게 보여주고, 사용자의 입력을 받아들입니다.
- Controller (컨트롤러): 사용자의 입력을 처리하고, 모델과 뷰를 연결합니다. 사용자의 요청을 받아 적절한 모델을 호출하고, 결과를 뷰에 전달합니다.
Dynamic Web Project 생성
HikariCP 라이브러를 사용하기 위해서 다른 추가적인 라이브러리 설정이 필요하다.
커넥션 풀을 사용하기 위한 DataSource 설계와 conext.xml 파일에 사용
context.xml 파일에 DataSource 설정 (HikariCP 사용 )
- Resource name="jdbc/MyDB": JNDI 이름으로, 애플리케이션에서 이 이름을 통해 데이터 소스를 참조합니다.
- auth="Container": 인증 방식으로, 컨테이너에 의해 인증됨을 의미합니다.
- type="javax.sql.DataSource”: 이 리소스가 DataSource 타입임을 명시합니다.
- factory="com.zaxxer.hikari.HikariJNDIFactory”: HikariCP의 JNDI 팩토리 클래스를 사용하여 데이터 소스를 생성합니다.
- uniqueResourceName="MyDB”: HikariCP 설정에 사용되는 고유한 리소스 이름입니다.
- minimumIdle="5": 최소 연결 수를 5로 설정합니다.
- maximumPoolSize="10”: 최대 연결 수를 10으로 설정합니다.
- connectionTimeout="30000”: 연결을 시도할 때 30초(30000 밀리초) 동안 대기합니다.
- idleTimeout="600000”: 유휴 상태의 연결을 10분(600000 밀리초) 동안 유지합니다.
- maxLifetime="1800000”: 연결의 최대 수명을 30분(1800000 밀리초)으로 설정합니다.
- driverClassName="com.mysql.cj.jdbc.Driver": MySQL JDBC 드라이버 클래스 이름입니다.
context.xml 파일을 사용하는 이유
자원 공유에 목적
- 여러 웹 애플리케이션이 동일한 자원(예: 데이터 소스)을 사용할 때, 이를 중앙에서 관리하고 공유할 수 있습니다.
- 각 웹 애플리케이션이 별도로 설정하지 않고도 동일한 설정을 사용할 수 있어, 설정의 중복을 피할 수 있습니다.
환경 설정 분리
- 애플리케이션 코드와 환경 설정을 분리하여 관리할 수 있습니다.
- 데이터베이스 연결 정보와 같은 환경 설정을 코드에서 분리하여 관리하면, 애플리케이션을 다른 환경(예: 개발, 테스트, 운영)으로 이동할 때 설정만 변경하면 됩니다.
즉, 대규모 애플리케이션에서는 많은 설정이 필요합니다. 이를 중앙에서 관리할 수 있는 방법론이 필요 하였고 관리자나 운영자가 설정을 일관되게 관리하고 변경할 수 있는 메커니즘이 제공하기 위한 기술로 발전하게 되었습니다.
context.xml 파일의 역할과 JNDI의 개념
context.xml
- 서버 시작 시 톰캣 같은 서블릿 컨테이너에 의해 로드됩니다. 일반적으로 web.xml 파일보다 먼저 실행이 됩니다.
- 이 파일에 정의된 리소스는 메모리에 객체로 올라가며, JNDI 네임스페이스에 이름으로 등록됩니다.
- 이러한 설정은 각 애플리케이션에서 공유할 수 있도록 전역적으로 설정됩니다.
JNDI (Java Naming and Directory Interface)
- 네이밍 및 디렉토리 서비스를 통해 자원(예: 데이터 소스)을 이름으로 찾고 참조하는 기술입니다.
- 애플리케이션은 JNDI 네임스페이스에 저장된 자원에 접근하여 해당 자원의 객체를 사용할 수 있습니다.
- JNDI를 통해 네이밍 서비스에 의해 관리되는 객체(리소스)를 중앙에서 쉽게 관리하고 공유할 수 있습니다.
중요!
context.xml에 기술된 리소스는 내부적으로 파일을 읽어서 객체를 WAS(Web Application Server)의 메모리에 로드하고, 해당 객체(DataSource)는 JNDI API를 활용하여 JNDI 네임스페이스에 설정된 이름으로 등록됩니다. 이렇게 등록된 객체는 전역적으로 다른 애플리케이션 또는 컴포넌트가 이름을 통해 접근하여 사용할 수 있는 기술입니다.
... 생략
InitialContext ctx = new InitialContext();
// JNDI 네임스페이스에서 "java:comp/env/jdbc/MyDB" 이름으로 데이터 소스를 찾음
dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB");
JNDI 이름 규칙
java:comp/env : 표준 JNDI 컨텍스트 루트로, 애플리케이션 환경 항목이 배치되는 기본 네임스페이스입니다.
Resource 이름 : 리소스 이름은 context.xml 파일에서 정의된 이름과 일치해야 합니다.
InitialContext 객체의 역할
InitialContext 객체는 JNDI (Java Naming and Directory Interface) API의 기본 클래스 중 하나로, 애플리케이션이 네이밍 및 디렉토리 서비스를 사용할 수 있도록 해줍니다
BasicDBUtil - 삭제 예정
테이블 설계
User 부분 처리
UserController
UserDTO
UserDAO
UserDAOImpl
Todo 부분 처리
TodoController
TodoDTO
TodoDAOImpl
JSP 부분 처리
webapp/views/signUp.jsp
webapp/views/todoFrom.jsp
webapp/views/todoList.jsp
webapp/views/todoDetail.jsp
'java' 카테고리의 다른 글
람다식(Lambda expression) - 부록2 (0) | 2024.09.13 |
---|---|
커스텀 태그(JSTL) 라이브러리 사용, (EL 표현식) (2) | 2024.07.15 |
게시판 만들어 보기 (0) | 2024.07.08 |
서블릿과 JSP의 개념과 차이점 (0) | 2024.07.05 |
쿠키와 세션 관리 (0) | 2024.07.04 |