# Intellij) JDBC 프로젝트 (5) 위임된 Main Application

> ***Simple JDBC Project (kor)  
> (1) ***[Java, DB 설치 + Docker Compose로 쉽게 해 보기](https://letsdev.hashnode.dev/intellij-jdbc-1-kor)  
> (***2)*** [***프로젝트 생성, Postgresql 컨테이너 게시***](https://letsdev.hashnode.dev/intellij-jdbc-2-kor)  
> ***(3)*** [***Flyway 도입하기***](https://letsdev.hashnode.dev/intellij-jdbc-3-kor)  
> ***(4)*** [JDBC 연결하기](https://letsdev.hashnode.dev/intellij-jdbc-4-kor)  
> (5) Main Application 만들기

# MainApplication Runner 만들기

자바의 main 함수는 `static` 함수입니다. 지금 설명하기에는 어려운 이야기지만, 우리는 static 필드 관리를 피할수록 좋습니다. 필드 변수든, 메소드든 static 위주로 사용하는 상황을 피하는 것이죠.

그래서 실행할 애플리케이션 역할을 거의 대신하는 클래스를 만들 것입니다.

* package: `com.example.app`
    

```java
package com.example.app;

public class MainApplicaiton {
    public void run() {
        // 이곳이 이제 main 함수의 역할을 거의 대신합니다.
        // 우리가 실행하려는 '관심사'의 코드가 대부분 이곳을 거쳐 표현됩니다.
        // 마치 메인 루틴이라고 생각할 수 있습니다. (엄연히 서브루틴으로 분류합니다.)
        System.out.println("잘 실행되고 있는지 확인합니다.");
    }
}
```

## Main 함수에서 호출

main 함수에서 MainApplicaiton 인스턴스를 생성하고, run 함수를 호출합니다. 직전 글에서 작성한 JDBC Access Check 인스턴스와 함수는 이제 필요하지 않습니다.

```java
import com.example.app.MainApplicaiton
import com.example.common.flyway.config.MyFlyway;

import static com.example.common.support.db.DatabaseAccessConstants.DB_PASSWORD;
import static com.example.common.support.db.DatabaseAccessConstants.DB_URL;
import static com.example.common.support.db.DatabaseAccessConstants.DB_USERNAME;

public class Main {

    public static void main(String[] args) {
        // 이전 글에서 작성한 플라이웨이 실행 코드입니다.
        MyFlyway myFlyway = new MyFlyway(DB_URL, DB_USERNAME, DB_PASSWORD);
        myFlyway.migrate();

        // 이제 본격적인 루틴을 실행합니다.
        MainApplicaiton application = new MainApplication();
        application.run();
    }

}
```

당연히 이 코드를 통해 Flyway가 동작하고, `"잘 실행되고 있는지 확인합니다."`라는 문자열이 콘솔 화면에 출력됩니다.

### 객체지향에서 위임(delegation)이란

객체지향에는 위임이라는 개념이 있습니다. 보통은 필드 수준에서 구현하는 편이죠. 프록시라고 부르는 편입니다. "내가 이것을 하겠다."라고 해 놓고, 다른 곳에 하청을 주는 것처럼 이해하셔도 꽤 편합니다.

이번에는 필드를 통한 위임까지는 사용하지 않았습니다. 지역 변수 수준에서 사용하였는데, 엄연히 위임 동작을 구현하고 있죠. (main 함수에 담을 주요 동작을 대부분 `MainApplication`의 `run()` 메서드에 담았죠.)

---

**&lt; Prev**

[(4) JDBC 연결하기](https://letsdev.hashnode.dev/intellij-jdbc-4-kor)
