투케이2K

43. (TWOK/UTIL) [Spring/Intelij] 기본 스프링 부트 프로젝트 구조 생성 및 오라클 DB 연결 설정 실시 본문

투케이2K 유틸파일

43. (TWOK/UTIL) [Spring/Intelij] 기본 스프링 부트 프로젝트 구조 생성 및 오라클 DB 연결 설정 실시

투케이2K 2022. 5. 12. 09:46

[설 명]

프로그램 : Spring / Intelij

설 명 : 기본 스프링 부트 프로젝트 구조 생성 및 오라클 DB 연결 설정 실시

 

[방법 설명]

 

[build.gradle]

plugins {
    id 'org.springframework.boot' version '2.6.7'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'

    // TODO [war file create]
    id 'war'
}

group = 'com.manager'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

//configurations {
//    compileOnly {
//        extendsFrom annotationProcessor
//    }
//}

// TODO [war 파일 빌드 명칭 변경]
war {
    archiveName 'manager.war'
}

// TODO [war file create]
configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'

    // TODO [war file create]
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'javax.servlet:jstl'
}

tasks.named('test') {
    useJUnitPlatform()
}
 

[ManagerProjectApplication]

package com.manager.managerproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ManagerProjectApplication {

    public static void main(String[] args) {
        SpringApplication.run(ManagerProjectApplication.class, args);
    }

}
 

[ServletInitializer]

package com.manager.managerproject;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ManagerProjectApplication.class);
    }

}
 

[application.yml]

# TODO [공통으로 사용]
spring:
  # [profiles : 배포 시 설정 이름 : spring 내 설정]
  profiles:
    active: prod
  # [devtools : spring 내 설정]
  devtools:
    livereload:
      enabled: true
  # [datasource : spring 내 설정]
  # [url : port 및 servername 작성]
  # [username : 스키마 명칭]
  # [password : 비밀 번호]
  datasource:
    driver-class-name: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:@105.58.176.205:1521:testserver
    username: TEST
    password: test#9988



# TODO [접속 포트 설정]
# 접속 주소 : http://localhost:7000/index.html
# 파일 경로 : config 폴더 >> MvcConfiguration 파일 >> 파일 경로 설정
# index.html 파일 : resource 폴더 >> templates 폴더 >> index.html 파일
server:
  port: 7000



# TODO [mybatis 설정 : xml 파일 경로 지정 필요]
mybatis:
  mapper-locations: classpath:D_Mybatis/*.xml
  type-aliases-package: com.manager.managerproject.model
 

[index.html]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<!--
[호출 방법]
1. application.yml 파일에서 지정한 서버 포트 확인
2. 호출 : http://localhost:7000/index.html
-->

<p>hello world</p>

</body>
</html>
 

[Database_Api_Controller]

package com.manager.managerproject.A_Controller;

import com.manager.managerproject.model.Time_Json_Model;
import com.manager.managerproject.B_Service.Database_Api_Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.configurationprocessor.json.JSONObject;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

// TODO [크로스 도메인 접속 허용 설정]
@CrossOrigin("*")


// TODO [RestController / Api 처리]
@RestController
public class Database_Api_Controller {


    /**
     * // -----------------------------------------
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 데이터베이스 접근 및 컨트롤러 클래스
     * // -----------------------------------------
     * 2. 사용자가 api 호출을 통해서 접근 수행
     * // -----------------------------------------
     * 3. service 클래스 호출 및 로직 연결 실시
     * // -----------------------------------------
     * */





    /**
     * // -----------------------------------------
     * // TODO [빠른 로직 찾기 : 주석 로직 찾기]
     * // -----------------------------------------
     * // [SEARCH FAST] : [테스트 API 호출]
     * // [SEARCH FAST] : [테스트 DB 호출]
     * // [SEARCH FAST] : [테스트 MODEL 리턴]
     *
     * // [SEARCH FAST] : [로그인 사용자 인증 요청]
     * // -----------------------------------------
     * */





    // TODO [Autowire 설정]
    @Autowired
    private Database_Api_Service database_api_service;



    // TODO [전역 변수 선언 실시]
    private static final String CLASS_NAME = "Database_Api_Controller";





    // TODO [SEARCH FAST] : [테스트 API 호출]
    @GetMapping("/testApi")
    public String testApi(@RequestParam Map<String, String> param){
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("testApi"));
        System.out.println("[INPUT] : "+String.valueOf(param.toString()));
        System.out.println("================================================");
        System.out.println("\n");


        /**
         * // -----------------------------------------
         * [호출 방법]
         * // -----------------------------------------
         * 1. 호출 방식 : GET
         * // -----------------------------------------
         * 2. 호출 방법 : http://localhost:7000/testApi
         * // -----------------------------------------
         * 3. 리턴 데이터 : Y : testApi
         * // -----------------------------------------
         * */


        // [Api 리턴 메시지 반환]
        return "Y : testApi";
    }





    // TODO [SEARCH FAST] : [테스트 DB 호출]
    @GetMapping("/testDB")
    public String testDB(@RequestParam Map<String, String> param){
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("testDB"));
        System.out.println("[INPUT] : "+String.valueOf(param.toString()));
        System.out.println("================================================");
        System.out.println("\n");


        /**
         * // -----------------------------------------
         * [호출 방법]
         * // -----------------------------------------
         * 1. 호출 방식 : GET
         * // -----------------------------------------
         * 2. 호출 방법 : http://localhost:7000/testDB
         * // -----------------------------------------
         * 3. 리턴 데이터 : 2022-05-12 (오라클 DB 조회 현재 날짜)
         * // -----------------------------------------
         * */


        // [service 호출 수행]
        String time = database_api_service.DB_TIME();


        // [Api 리턴 메시지 반환]
        return time;
    }





    // TODO [SEARCH FAST] : [테스트 MODEL 리턴]
    @GetMapping("/testModel")
    public Time_Json_Model testModel(@RequestParam Map<String, String> param){
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("testModel"));
        System.out.println("[INPUT] : "+String.valueOf(param.toString()));
        System.out.println("================================================");
        System.out.println("\n");


        /**
         * // -----------------------------------------
         * [호출 방법]
         * // -----------------------------------------
         * 1. 호출 방식 : GET
         * // -----------------------------------------
         * 2. 호출 방법 : http://localhost:7000/testModel
         * // -----------------------------------------
         * 3. 리턴 데이터 : {"state":"T","time":"2022-05-12"}
         * // -----------------------------------------
         * */


        // [service 호출 수행]
        String time = database_api_service.DB_TIME();


        // [model 형식 리턴 데이터 반환]
        return new Time_Json_Model("T", time);
    }





    // TODO [SEARCH FAST] : [로그인 사용자 인증 요청]
    @PostMapping("/login_access")
    public String login_access(@RequestParam Map<String, String> param){ // [쿼리 파람 방식]
    //public String login_access(@RequestBody Map<String, String> param){ // [body 방식]
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("login_access"));
        System.out.println("[INPUT] : "+String.valueOf(param.toString()));
        System.out.println("================================================");
        System.out.println("\n");


        /**
         * // -----------------------------------------
         * [호출 방법]
         * // -----------------------------------------
         * 1. 호출 방식 : POST [쿼리 파람]
         * // -----------------------------------------
         * 2. 호출 방법 : http://localhost:7000/login_access?id=twok&pw=tk1234
         * // -----------------------------------------
         * 3. 리턴 데이터 :
         *
         *   {"I_ID":"twok","O_CURSOR":[{"권한":"1","노트":"모든 기능 사용","아이디":"twok","비밀번호":"twok@kr","일자":"20200512153945","학교":"DEV"}],"O_MSG":"Y : 정상 로그인 성공 [M_DEBUG : 3-1-1]","I_PW":"twok@kr"}
         *
         *   {"I_ID":"twok123","O_CURSOR":[null],"O_MSG":"N : 등록된 사용자가 아닙니다. 관리자에게 연락바랍니다. [M_DEBUG : 3-1-2]","I_PW":"tk@1234"}
         *
         * // -----------------------------------------
         * */


        // [인풋 데이터를 받을 변수 선언 실시]
        String id = "";
        String pw = "";


        // [정상적으로 인풋 데이터가 포함되었는지 확인]
        try {
            JSONObject inputJson = new JSONObject(param);

            if (inputJson.has("id") == true){ // [특정 key 값을 포함하는 경우]
                id = String.valueOf(inputJson.get("id"));
            }

            if (inputJson.has("pw") == true){ // [특정 key 값을 포함하는 경우]
                pw = String.valueOf(inputJson.get("pw"));
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [service 호출 수행]
        Map map = database_api_service.PRO_UMCS_MANAGER(id, pw);


        // [리턴 받은 map 데이터 널 체크 실시]
        try {
            if (map != null){
                JSONObject resultJson = new JSONObject(map);
                System.out.println("\n");
                System.out.println("================================================");
                System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
                System.out.println("[METHOD] : "+String.valueOf("login_access"));
                System.out.println("[RESULT] : "+String.valueOf(resultJson));
                System.out.println("================================================");
                System.out.println("\n");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [리턴 데이터 반환]
        return "";
    }


} // TODO [클래스 종료]
 

[Database_Api_Service]

package com.manager.managerproject.B_Service;

import com.manager.managerproject.C_Mapper.Database_Api_Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

// TODO [서비스 어노테이션]
@Service
public class Database_Api_Service {


    /**
     * // -----------------------------------------
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 데이터베이스 접근 및 서비스 클래스
     * // -----------------------------------------
     * 2. mapper 인터페이스 메소드 호출 수행 실시
     * // -----------------------------------------
     * */





    /**
     * // -----------------------------------------
     * // TODO [빠른 로직 찾기 : 주석 로직 찾기]
     * // -----------------------------------------
     * // [SEARCH FAST] : [테스트 DB 호출]
     * // [SEARCH FAST] : [로그인 사용자 인증 요청]
     * // -----------------------------------------
     * */





    // TODO [Autowire 설정]
    @Autowired
    private Database_Api_Mapper database_api_mapper;





    // TODO [SEARCH FAST] : [테스트 DB 호출]
    public String DB_TIME(){

        // [mapper 인터페이스 호출 실시]
        return database_api_mapper.DB_TIME();
    }





    // TODO [SEARCH FAST] : [로그인 사용자 인증 요청]
    public Map PRO_UMCS_MANAGER(String id, String pw){

        // [mybatis xml 에서 설정한 인풋값 명칭에 맞게 데이터 가공 실시]
        Map map = new HashMap<>();
        map.put("I_ID", id);
        map.put("I_PW", pw);


        // [mapper 인터페이스 호출 실시]
        database_api_mapper.PRO_UMCS_MANAGER(map);


        // [프로시저 수행 후 리턴 값이 map 에 자동으로 담긴다]
        return map;
    }

} // TODO [클래스 종료]
 

[Database_Api_Mapper]

package com.manager.managerproject.C_Mapper;

import org.apache.ibatis.annotations.Mapper;

import java.util.Map;

// TODO [매퍼 어노테이션]
@Mapper
public interface Database_Api_Mapper {


    /**
     * // -----------------------------------------
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 데이터베이스 접근 및 매퍼 인터페이스
     * // -----------------------------------------
     * 2. 데이터베이스 쿼리문 수행 xml 리턴 값 받음
     * // -----------------------------------------
     * */





    /**
     * // -----------------------------------------
     * // TODO [빠른 로직 찾기 : 주석 로직 찾기]
     * // -----------------------------------------
     * // [SEARCH FAST] : [테스트 DB 호출]
     * // [SEARCH FAST] : [로그인 사용자 인증 요청]
     * // -----------------------------------------
     * */





    // TODO [SEARCH FAST] : [테스트 DB 호출]
    String DB_TIME();





    // TODO [SEARCH FAST] : [로그인 사용자 인증 요청]
    void PRO_UMCS_MANAGER(Map map); // [프로시저 : void]


} // TODO [클래스 종료]
 

[Database_Api_Mybatis.xml]

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!-- mapper 인터페이스 지정 : com.manager.managerproject.C_Mapper -->
<mapper namespace="com.manager.managerproject.C_Mapper.Database_Api_Mapper">


    <!--
    // =========================================
    // [파일 설명]
    // =========================================
    1. DB 접근 및 쿼리, 프로시저, 함수 호출 수행 파일
    // =========================================
    2. mapper 리턴 데이터를 받을 인터페이스 설정 필요
    // =========================================
    -->





    <!--
    // =========================================
    // [빠른 로직 찾기 : 주석 로직 찾기]
    // =========================================
    // [SEARCH FAST] : [테스트 DB 호출]
    // =========================================
    // [SEARCH FAST] : [로그인 사용자 인증 요청]
    // =========================================
    -->





    <!--
    // =========================================
    // [SEARCH FAST] : [테스트 DB 호출]
    // =========================================
    // [select id] [mapper 인터페이스 지정 메소드] : DB_TIME
    // =========================================
    -->
    <select id="DB_TIME" resultType="String">
        <![CDATA[
        select TO_CHAR(SYSDATE, 'YYYY-MM-DD')
            from dual
        ]]>
    </select>





    <!--
    // =========================================
    // [SEARCH FAST] : [로그인 사용자 인증 요청]
    // =========================================
    // [select id] [mapper 인터페이스 지정 메소드] : PRO_UMCS_MANAGER
    // =========================================
    // [resultMap] : 프로시저 수행 후 리턴 메시지 및 커서 테이블이 담길 맵
    // =========================================
    -->
    <resultMap id="PRO_UMCS_MANAGER_RESULT" type="hashmap" />
    <select id="PRO_UMCS_MANAGER" parameterType="hashmap" statementType="CALLABLE">
        <![CDATA[
        { call PRO_UMCS_MANAGER (
                #{I_ID},
                #{I_PW},

                #{O_MSG, mode=OUT, jdbcType=VARCHAR, javaType=string, resultMap=PRO_UMCS_MANAGER_RESULT},
                #{O_CURSOR, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=PRO_UMCS_MANAGER_RESULT}
            )}
        ]]>
    </select>


</mapper>
 

[Time_Json_Model]

package com.manager.managerproject.model;

import lombok.Data;

// TODO [Data 어노테이션 : getter , setter]
@Data
public class Time_Json_Model {


    /**
     * // -----------------------------------------
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. Time 형식 데이터 Json 문자열로 리턴 수행
     * // -----------------------------------------
     * 2. 리턴 형식 : {"state":"T","time":"2022-05-12"}
     * // -----------------------------------------
     * */



    // TODO [전역 변수 선언]
    private String state; // [상태 값 : T / F]
    private String time; // [time 값 : 2022-05-12]



    // TODO [클래스 생성자 초기화]
    public Time_Json_Model(String state, String time) {
        this.state = state;
        this.time = time;
    }


} // TODO [클래스 종료]
 

[MvcConfiguration]

 

package com.manager.managerproject.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MvcConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //WebMvcConfigurer.super.addResourceHandlers(registry);

        // TODO [resource >> static >> 리소스 연결]
        registry.addResourceHandler("/**").addResourceLocations("classpath:/templates/", "classpath:/static/");
    }
}

반응형
Comments