0714 - Servlet JNDI / DTO DAO VO

이진성·2021년 7월 15일
0

JNDI

  • JNDI - Java Naming & DIrectory Service

    • WAS에 우리가 사용한 DataSource 리소스 객체 같은 다양한 타입의 객체를 JNDI tree에 올려놓고, JNDI lookup 이라는 행위를 통해서, JNDI tree에 올려놓은 다양한 자원객체를 얻는 표준 방법.
  • @Resource 어노테이션을 통한, JNDI Tree의 자원객체를 획득하는 방법은, 오로지 Servlet Class 내에서만 유효함.

JNDI 연결

  • JNDI lookup을 통해서, DataSource 객체를 얻어서 Connection Pool을 사용. * lookup -> 참고한다 의미로 해석하면될듯?
    Context ctx = null;
    ctx = new InitialContext(); //JNDI root 참조 획득
  • InitialContext()는 웹 어플리케이션이 처음으로 배치될때 설정되고, 모든 설정된 엔트리와 자원은 JNDI namespace의 java:comp/env 부분에 놓이게 된다.
  • Context는 자원객체이므로, 반드시 사용이 끝나면 close 해줘야 함.
    • 단 이 Context 인터페이스는 AutoClosable 하지 않으므로, 직접 finally 블록에서 close해줘야 함.
try {
	ctx = new InitialContext(); // JNDI root 참조 획득

	Object obj = ctx.lookup("java:comp/env/jdbc/OracleCloud");
	this.ds = (DataSource) obj;
	
} catch (Exception e) {
	throw new ServletException(e);
} finally {
	if(ctx != null) {
		try {
			ctx.close();
		} catch (NamingException e) {
			
		} //try- catch
	}//if
}//try-catch-finally
  • JNDI root을 통해, JNDI tree를 lookup(참고)
  • 자원객체의 이름 지정은 표준화되어 있다. --> "java:comp/env/" + 자원객체의 이름
    --> 자원객체의 이름은 context.xml에 지정한 Resource name
Object obj = ctx.lookup("java:comp/env/jdbc/OracleCloud");
this.ds = (DataSource) obj;

DTO, VO, DAO

Web 3-tire (or 3-Layer)

Presentation Layer

  • Presentation Logic (화면의 로직)
  • HTML5, JSP

Business Layer

  • Business Logic 구현 (ex: 계좌이체)
  • Servlet 객체

Persistence(DB) Layer

  • Persistence Logic (DB Logic)
  • DAO 패턴 객체 (Data Access Object)
Presentation LayerBusiness LayerPersistence(DB) Layer
Persentation Logic (화면의 로직)Business Logic 구현 (ex: 계좌이체)Persistence Logic (DB Logic)
HTML5, JSPServlet 객체DAO 패턴 객체(Data Access Object)

DTO는 비즈니스 로직처리에 필요한 모든 데이터를 가지고 있는 객체로, 웹 3계층(Web 3-Layer)의 앞에서 -> 뒤로 전달되는 이 객체를 DTO (Data Transfer Object) 객체라고 한다.(DTO 패턴 적용)

비지니스 로직처리가 끝나고. 이 로직의 결과로 발생한, 데이터를 화면에 보여주기 위해, 로직처리 결과 데이터를 가지고 있는 객체를, VO (Value Object)라고 한다. 이런식으로 객체를 만드는 패턴을 VO 패턴이라고 한다.

주의사항

    1. DTO, VO 클래스의 모든 필드의 타입은, 기본타입을 사용하지 않고, 참조타입으로 선언해야 한다!
    • 왜? 기본타입은 null 값을 대입할 수 없다. 하지만 우리는 DB 처리를 위해 SQL을 사용해야 하기 때문에 값으로 null이 올 경우도 생각해야 함.
    • 따라서 null 값 사용을 위해 참조타입(레퍼타입)으로 필드를 선언한다.
    1. DTO, VO 클래스는 기본적으로, 자바빈즈 규약에 따라 만든다.
    1. VO 클래스는, SELECT SQL 문장수행으로 발생한 결과셋의 모든 레코드를 저장하는 용도가 아니라, 단 하나의 레코드만 저장할 수 있도록 설계하고, 이 VO객체를 자료구조(List/Set/Map)에 담아서, 여러 레코드를 Web 3-Layer(웹 3계층)의 앞으로 전달
    1. VO 클래스는, 테이블 당 하나씩 매핑되게 만든다.
    1. VO 클래스는, 테이블의 1개 레코드를 읽기전용으로 사용할 수 있도록 해야 하기 때문에, 자바빈즈 규약 중 1개를 위배한다.
    • 즉, 매개변수 없는 기본 생성자가 없다.
  • 다음은 자바빈즈(JavaBeans) 클래스 규약이다.
    • 1) private 접근제한자로 필드를 선언한다. (필수)
    • 2) getter 메소드와 setter 메소드를 갖는다. (필수)
    • 3) 기본 생성자가 반드시 존재해야 된다. (필수)
    • 4) implements Serializable (선택)

//기본 생성자 
@NoArgsConstructor(access=lombok.AccessLevel.PUBLIC)

//Getter
@Getter

//Setter
@Setter

//객체의 값을 예쁘게 찍어주기 위한 ToString
@ToString

//2단계 중복알고리즘을 대체하는 EqualsAndHashCode
@EqualsAndHashCode

위 5가지 lombok 어노테이션을 DTO를 만들때 한번에 사용해주는 어노테이션이 @Data 어노테이션
VO를 만들때에는 @Value 어노테이션 사용


DTO -> DAO -> VO 흐름의 예

  1. HTML 사원정보저장 웹 페이지에서 데이터 폼을 입력받음
  2. Servlet에서 수신된 전송파라미터를 DTO 객체로 저장 (DTO 클래스에 Setter 메소드를 통해서...)
  3. DTO 정보객체를 받아 DAO 객체로 DB 처리 (DTO에 담긴 사원정보를 DAO 객체를 통해 DB에 INSERT)
  4. (사원정보 DB SELECT) DAO를 거쳐서 도출(SELECT)된 1개의 레코드 데이터 값은 VO 객체에 읽기전용(READ ONLY)으로 담긴다.
    이 각 VO객체를 List에 저장해주고, 웹 HTML 상에 DB값을 출력(Getter)

웹HTML에서 입력받은 데이터 -> 즉, HTML에서 요청내용의 정보를담는 객체가 DTO

DAO는 DB처리 -> 즉, 연결 및 SQL수행(데이터 SELECT, 데이터 INSERT UPDATE DELETE)

  • Data Access Object => 말 그대로, Database의 data에 Access하는 객체, 실질적으로 DB에 접근을 수행하는 객체이다.
  • DB에 연결해 데이터를 조회하거나 조작하는 기능을 전담하는 객체

VO는 DAO를 거쳐서 도출된 값(정보객체?)을 저장한다

  • 데이터를 화면에 보여주기 위해 로직처리 결과 데이터를 가지고 있는 객체를, VO (Value Object)라고 한다

0개의 댓글