본문 바로가기
Portpolio/webdev_tip

토비의 스프링 3.1 1권 스터디 01. 오브젝트와 의존관계

by Peter Choi 2024. 1. 13.
반응형

1.1 초난감 DAO
우선 DAO는 Data Access Object를 의미하며, DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트를 의미한다. 

 

JDBC는 자바에서 데이터베이스에 접근할 수 있도록 하는 자바 API이다. 

출처: https://velog.io/@kbj7227/Spring-JDBC

그렇다면 JDBC driver는 어떤 과정을 통해서 해당하는 DB를 찾을 수 있는 것일까? 

1. 드라이버 로드

2. Connection 객체 생성

3. Statement 객체 생성

4. 쿼리 실행

5. ResultSet 객체를 이용해서 데이터 조회

6. 생성한 객체 close

 

그렇다면 이 과정을 코드로 간단하게 구현해보자. 아래는 Mysql java driver가 메모리에 로드되어서 MySQL DB에 연결되는 과정에 대한 코드이다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnector {
    public static void main(String[] args) {
        String jdbcUrl = "jdbc:mysql://localhost:3306/your_database";
        String username = "your_username";
        String password = "your_password";

        try {
            // 드라이버 로딩 (JDBC 4.0 이상에서는 생략 가능)
            Class.forName("com.mysql.jdbc.Driver");

            // Connection 얻기
            Connection connection = DriverManager.getConnection(jdbcUrl, username, password);

			if (connection != null) {
            	log("연결에 성공했습니다!");
            } else {
            	log("연결에 실패했습니다!");
              }
            // 연결 종료
            connection.close();
        } catch (ClassNotFoundException | SQLException e) {
        	log("MySQL 연결에 실패했습니다!");
            e.printStackTrace();
            return;
          }
    }
}

3306번 포트는 MySQL 데이터베이스 서버에 사용되는 포트 번호이다. 


1.2 DAO의 분리

DAO가 분리됨으로서, 데이터베이스 스키마 변경, 액세스 로직 변경 시 최소한의 부분만 수정할 수 있기 때문에 매우 편리해진다. 

 

entity는 DB와 가장 가까운 부분에 있기 때문에 수정을 최소한으로 해야 한다.

 

1.3 DAO의 확장

응집도는 변화가 일어날 때 해당 모듈에서 변하는 부분에 대한 정도를 의미한다. 

 

결합도는 하나의 오브젝트가 변경이 일어날 때에 관계를 맺고 있는 다른 오브젝트에게 변화를 요구하는 정도를 의미한다. 모듈과 모듈의 상호 의존도를 나타낸다.

 

일반적을 결합도를 낮게, 응집도는 높게 하는 것이 요구된다.


1.4 제어의 역전(IoC)

팩토리란 객체의 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 팩토리라고 한다.

 

제어의 역전은 서블릿을 제어하는 컨테이너가 일반적인 자바 파일처럼 main 메서드를 만들고 사용자가 실행시키는 것이 아니라 직접 제어하는 방법을 사용하는 것에 잘 적용되어 있다.

 

라이브러리와 프레임워크의 차이점 역시 IoC와 깊은 연관이 있다.

1.5 스프링의 IoC

빈은 스프링이 제어권을 가지고 관계를 부여하는 오브젝트를 의미한다. 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리라고 한다.

 

1.6 싱글톤 레지스트리와 오브젝트 스코프
서블릿은 서비스 오브젝트 중 하나이다.  그리고 멀티스레드 환경에서 싱글톤으로 동작한다.

 

싱글톤 패턴은 같은 생성자가 여러 번 호출되더라도 최초 생성자 호출 시 생성되는 하나의 동일한 인스턴스가 반복적으로 반환되는 패턴을 의미한다.

class Singleton {
    private static Singleton ourInstance = null;

    public static Singleton getInstance() {

        if (ourInstance == null) {
            ourInstance = new Singleton();
        }

        return ourInstance;
    }

    private Singleton() {}
}

 

// 보통 인스턴스 호출 방법(새로운 인스턴스가 생성)
Singleton singletonInstance = new Singleton();

// 싱글톤 호출 방법(한번 생성한 인스턴스가 지속적으로 사용)
Singleton singletonInstance = Singleton.getInstance();

 

싱글톤 패턴을 멀티스레드 환경에서 사용할 때에는 각 스레드 별로 인스턴스를 만들려고 경쟁하면서 메모리가 낭비되는 현상이 발생되는 문제가 발생한다.

 

이를 해결하기 위한 방법으로 syncronized 라는 동기화를 사용하거나 LazyHolder 방식 등을 사용할 수도 있을 것이다.

https://seunghyunson.tistory.com/28 참고

 

1.7 의존관계 주입(DI)

보통 위와 같이 인터페이스를 통해 의존관계를 제한하는 것이 DconnectionMaker에 직접 의존하는 것보다 변경 시 UserDao의 변경 범위도 줄어들게 된다.


1.8 XML을 이용한 설정
xml은 일반적인 텍스트 파일이다. 주로 스프링에서 bean을 등록하거나 설정할 때 활용된다.

 

주로 maven에서 pom.xml이라는 파일 등으로 자주 볼 수 있다. 여기서 pom은 project object model의 약자를 의미한다. 즉 프로젝트 내의 빌드 옵션을 설정하는 xml 파일이라는 것을 알 수 있다.

 

그렇다면 메소드를 <bean> 태그로 전환하는 예시를 한 가지 살펴보도록 한다.

package com.example;

public class MyService {
    public void myMethod() {
        // 메소드의 내용
        System.out.println("Hello, this is myMethod!");
    }
}

 

<!-- applicationContext.xml -->
<!-- MyService 클래스를 빈으로 정의 -->
<bean id="myServiceBean" class="com.example.MyService"/>

</beans>
반응형

'Portpolio > webdev_tip' 카테고리의 다른 글

MariaDB 데이터 타입  (0) 2024.01.19
npm install가 EACCES 뜨면서 안 될때 대처법  (1) 2024.01.15
토비의 스프링 3.1 1권 스터디 00. 시작  (1) 2024.01.11
Spring 웹 계층  (0) 2024.01.11
JDK와 JRE의 차이점  (0) 2024.01.10

댓글