관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

데이터베이스를 이용한 회원 관리 시스템 구축하기 10 - 퀴즈로 정리합시다 문제 풀기 본문

웹 · 앱 개발/JSP & Servlet

데이터베이스를 이용한 회원 관리 시스템 구축하기 10 - 퀴즈로 정리합시다 문제 풀기

huenuri 2024. 12. 16. 01:19

퀴즈 문제를 풀어보려고 한다. 문제는 다른 단원에 비해 짧지만 문제가 많이 어려웠다. 7문제 중에서 단 두 문제를 맞혔을 뿐이었다. 마음이 안 좋았지만 그래도 틀린 만큼 알게 되는 게 있으리라 생각한다.


 

 

 

 

퀴즈로 정리합시다 문제 풀기

 


 

 

 

 

문제 2번

답은 3번이다.

 

  • DTO (Data Transfer Object) : 데이터 전송을 위한 객체로, 주로 계층 간 데이터 교환을 목적으로 사용된다.
  • VO (Value Object) : 값을 표현하기 위한 객체로, 주로 읽기 전용 데이터에 사용된다.
  • Domain Object : 비즈니스 로직에 따라 데이터를 캡슐화한 객체로, 데이터베이스의 테이블과 1:1로 매핑되는 경우가 많다.
  • DAO (Data Access Object) : 데이터베이스에 접근하여 데이터를 CRUD(Create, Read, Update, Delete) 작업하는 객체로, 데이터를 저장하는 목적보다는 데이터베이스와의 통신을 담당한다.

따라서, 데이터 저장을 위한 자바 객체 타입이 아닌 DAO가 정답이다.


 

 

 

 

 

문제 3번

답은 관점에 따라 1번이 될 수도 3번이 될 수도 있다는 것을 알게 되었다.

 

context.xml은 개별 웹 애플리케이션의 설정 파일로, 주로 데이터베이스 연결과 같은 리소스 정의를 포함한다. 문제에서 보여준 <Context> 태그와 <Resource> 태그는 커넥션 풀 설정을 나타내며, 이는 context.xml 파일에 작성하는 것이 일반적이다.

 

  • server.xml : Tomcat 서버 전체 설정을 담고 있다. 웹 애플리케이션 개별 설정보다는 전체 서버와 관련된 설정이 정의된다.
  • web.xml : 각 웹 애플리케이션의 배포 기술자를 설정한다. URL 매핑, 필터, 리스너 등의 설정이 주로 포함된다.
  • resource.xml : 일반적으로 사용되지 않는 옵션이다.

 

문제와 답에 대한 관점 차이

  • context.xml은 개별 웹 애플리케이션의 커넥션 풀 리소스를 설정하는 경우 사용된다.
  • 하지만, server.xml을 사용하는 경우는 Tomcat의 전역 리소스 설정을 다룰 때이며, 문제의 의도가 전역 설정임을 암시했을 가능성이 높다.

 

결론

  • 문제의 답이 1번(server.xml)으로 제시된 이유는 커넥션 풀 리소스를 Tomcat 전역 설정으로 등록하려는 의도 때문으로 보인다.
  • 실제 사용 환경에 따라, context.xml이나 server.xml 중 하나를 선택해서 사용할 수 있다.

하지만 대부분의 경우 server가 아닌 context에서 설정을 변경한다. 나도 여기서 코드를 추가했다. 그러니까 이건 저자가 답을 잘못 쓴 것이다.


 

 

 

 

문제 4번

<Resource name="jdbc/myoracle"
          auth="Container"
          type="javax.sql.DataSource"
          driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:@localhost:1521:ORCL"
          username="hr"
          password="hr"
          maxActive="20"
          maxIdle="10"
          maxWait="-1" />

 

 

태그 설명

  1. name="jdbc/myoracle"
    • JNDI(Java Naming and Directory Interface)로 접근할 때 사용할 리소스 이름이다.
    • 코드에서 java:/comp/env/jdbc/myoracle로 접근한다.
  2. auth="Container"
    • 리소스 인증 방식이다.
    • Container는 서블릿 컨테이너(Tomcat)가 인증을 관리한다는 뜻이다.
  3. type="javax.sql.DataSource"
    • 데이터베이스 커넥션 풀에 사용할 객체 타입을 명시한다.
  4. driverClassName="oracle.jdbc.OracleDriver"
    • 오라클 데이터베이스에 연결하기 위한 드라이버 클래스 이름이다.
  5. url="jdbc:oracle:thin:@localhost:1521:ORCL"
    • 오라클 데이터베이스 연결 URL이다.
    • 여기서 ORCL은 오라클 데이터베이스 이름(SID)이다.
  6. username="hr" & password="hr"
    • 오라클 데이터베이스에 접속하기 위한 사용자 계정 정보이다.
  7. maxActive="20"
    • 커넥션 풀에서 동시에 사용할 수 있는 최대 활성 커넥션 개수이다.
  8. maxIdle="10"
    • 커넥션 풀에서 유휴 상태로 유지할 커넥션의 최대 개수이다.
  9. maxWait="-1"
    • 커넥션이 없을 경우 대기 시간이다. -1은 무제한 대기를 의미한다.

 

 

 

 

 

 

 


 

 

 

 

문제 5번

 

5-1. 게시글 목록을 얻어오는 메소드의 원형 정의

게시글 목록을 가져오는 메소드는 보통 DAO 클래스에서 데이터베이스의 board 테이블에서 모든 데이터를 조회하여 리스트 형태로 반환한다. 메서드의 이름은 getBoardList로 지정되어 있고, 반환형은 List<BoardVO>입니다. 아래는 메서드 원형의 예시이다.

public List<BoardVO> getBoardList() throws Exception;

 

 

5-2. 게시글을 데이터베이스에 추가하기 위한 메소드 정의

게시글을 추가하는 메소드는 입력받은 게시글 정보를 데이터베이스의 board 테이블에 삽입한다. 메서드 이름은 insertBoard로 지정되어 있고, 매개변수는 BoardVO 타입의 객체입니다. 아래는 메서드 원형의 예시이다.

public int insertBoard(BoardVO board) throws Exception;
  • insertBoard 메소드는 삽입이 성공하면 삽입된 레코드 수(보통 1)를 반환하고, 실패하면 예외를 발생시키도록 설계된다.

이 메소드들은 DAO 클래스에서 데이터베이스 작업을 처리할 때 자주 사용되는 메서드이며, BoardVO 객체는 게시글의 데이터를 담는 역할을 한다.


 

 

 

 

문제 7번

 

1. 커넥션 풀의 중요성

  1. 성능 향상
    애플리케이션이 데이터베이스에 연결할 때 매번 새 커넥션을 생성하고 닫는 과정은 시간이 많이 걸린다. 커넥션 풀을 사용하면 미리 생성된 커넥션을 재사용하여 연결 비용을 줄인다.
  2. 자원 관리
    커넥션 풀은 데이터베이스 커넥션 수를 제한하여 자원 고갈 및 과부하를 방지한다.
  3. 다중 사용자 지원
    동시에 여러 사용자가 데이터베이스에 접근할 수 있도록 효율적으로 연결을 관리한다.

 

 

2. <Resource> 태그의 설정 예시 (context.xml에 작성)

<Context>
    <Resource 
        name="jdbc/mydb"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@localhost:1521:XE"
        username="scott"
        password="tiger"
        maxActive="20"
        maxIdle="10"
        maxWait="-1" />
</Context>

 

 

 

 

3. DataSource로 Connection 객체를 가져오는 코드

import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DBUtil {
    public static Connection getConnection() throws Exception {
        Connection conn = null;
        try {
            // InitialContext 생성
            Context initContext = new InitialContext();

            // java:/comp/env에서 JNDI 리소스를 찾음
            Context envContext = (Context) initContext.lookup("java:/comp/env");

            // DataSource로부터 커넥션 풀 가져오기
            DataSource ds = (DataSource) envContext.lookup("jdbc/mydb");

            // 커넥션 풀에서 Connection 객체를 가져옴
            conn = ds.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("커넥션 풀에서 Connection 객체를 가져오는 중 오류 발생");
        }
        return conn;
    }
}

 

 

 

 

학습을 마치고

문제가 정말 어려워서 Chatgpt에게 물어보며 풀어보았다. 책에는 정답만 달랑 나와있지만 이렇게 물어보면서 공부를 할 수 있다는 것이 얼마나 큰 축복인지 모른다. 그 어떤 선생님보다 잘 가르치고 친절하게 설명해 주는 내게 최고의 스승이다.

이제 도전 문제도 풀어보겠다.