๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ข ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

  • ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„  Spring Boot + MyBatis + MySql ์—ฐ๋™ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.
  • Intellij Community ์—์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋‹ค๋ฅธ IDE๋ฅผ ์จ๋„ ์ƒ๊ด€ ์—†๋‹ค.
  • Spring Boot ๊ฐ€ ์„ค์น˜๋œ ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. Spring Boot ์„ค์น˜๋ฒ•์€ ์ง€๋‚œ ํฌ์ŠคํŒ…์„ ์ฐธ์กฐ. (Nuxt.js + Spring Boot ์—ฐ๋™๋ฒ• ํฌ์ŠคํŒ…์ด์ง€๋งŒ Spring Boot ์„ค์น˜์— ๋Œ€ํ•ด์„œ๋„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.)

๐Ÿงฑ MySQL, MyBatis Dependency ์ฃผ์ž…

pom.xml์˜ dependencies์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>
 <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

 

  • mysql-connector-java
    • JAVA ๊ฐ€ MySQL๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„
  • mybatis-spring-boot-starter
    • Spring Boot ์šฉ Mybatis

์œ„ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ๋ฒ„์ „์€ Maven Repository์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์›ํ•˜๋Š” ์˜์กด์„ฑ์„ ๊ฒ€์ƒ‰ ํ›„ ์ตœ์‹ , ํ˜น์€ ๋ณดํŽธ์ ์ธ ๋ฒ„์ „์˜ ์˜์กด์„ฑ ์ฃผ์ž… ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด ๋ถ™์—ฌ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

๐Ÿงฑ MySQL ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

DB ์—ฐ๊ฒฐ์— ์•ž์„œ DB๊ฐ€ ์ œ๋Œ€๋กœ ์—ฐ๊ฒฐ๋ ์ง€ ํ…Œ์ŠคํŠธ ๋จผ์ € ํ•ด๋ณด์ž.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด pom.xml์— ์•„๋ž˜ dependency๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์ž.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
  • spring-boot-starter-test
    • Spring์€ ์œ„์™€ ๊ฐ™์€ spring-boot-starter-test ์˜์กด์„ฑ์„ ํ†ตํ•ด TEST ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
    • ์œ„ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด JUnit ๋“ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ž์„ธํžˆ

src/test/java/dbTest/MySQLConnectionTest.java

src ํด๋” ๋‚ด์— test ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,
test ํด๋” ๋‚ด์— package๋ฅผ ๋งŒ๋“  ํ›„ ์ž๋ฐ” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ž.
๋‚˜๋Š” MySQLConnectionTest.java๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์คฌ๋‹ค.

package dbTest;

import org.junit.Test;

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

public class MySQLConnectionTest {

    // MySQL Connector ์˜ ํด๋ž˜์Šค. DB ์—ฐ๊ฒฐ ๋“œ๋ผ์ด๋ฒ„ ์ •์˜
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    // DB ๊ฒฝ๋กœ
    private static final String URL = "jdbc:mysql://localhost:3306/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false";
    private static final String USER = "์œ ์ € ID";
    private static final String PASSWORD = "๋น„๋ฐ€๋ฒˆํ˜ธ";

    @Test
    public void testConnection() throws Exception {
        // DBMS์—๊ฒŒ DB ์—ฐ๊ฒฐ ๋“œ๋ผ์ด๋ฒ„์˜ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ
        Class.forName(DRIVER);
        try {
            Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
            System.out.println(connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

MySQLConnectionTest.java์— ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์คฌ๋‹ค.
try ๋ถ€๋ถ„์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, DB ์ปค๋„ฅ์…˜์ด ์ œ๋Œ€๋กœ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ถœ๋ ฅํ•ด ํ™•์ธํ•ด๋ณด๋Š” ๊ณผ์ •์ด๋‹ค.

  • allowPublicKeyRetrieval
    • ํด๋ผ์ด์–ธํŠธ ์˜ต์…˜์„ ์ถ”๊ฐ€ ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—์„œ ์ž๋™์œผ๋กœ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
    • default๋Š” false
    • MySQL 8.0 ์ด์ƒ์€ ์ด๋ฅผ true๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์„ ์‹œ public key retrieval is not allowed ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • userSSL
    • default๋Š” `true
    • false๋กœ ์ง€์ • ์‹œ SSL ์‚ฌ์šฉ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ, ํ˜น์€ ํ…Œ์ŠคํŠธ ์ค‘์—์„œ๋งŒ ๋น„ํ™œ์„ฑํ™” ์‹œํ‚ค๋Š” ๊ฑธ ์ถ”์ฒœ
    • ๋ฐฐํฌ ์‹œ์—” useSSL๋ฅผ false๋กœ ์ง€์ •ํ•˜๊ธฐ๋ณด๋‹จ SSL์„ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ฒฐ๊ณผ ๋กœ๊ทธ

TEST ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด com.mysql.cj.jdbc.ConnectionImpl@~๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œฐ ๊ฒƒ์ด๋‹ค.
DB ์—ฐ๊ฒฐ์— ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋‹ค! ๐ŸŽ‰

๐Ÿงฑ Spring Boot + MyBatis + MySQL ์—ฐ๊ฒฐ

DB ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ๋ฅผ ์™„๋ฃŒํ–ˆ์œผ๋‹ˆ ๋ณธ๊ฒฉ์ ์œผ๋กœ DB ์—ฐ๊ฒฐ์„ ํ•ด๋ณด์ž

/src/main/resources/ ๋‚ด์— application.properties ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ DB Connection ์„ ์œ„ํ•œ DB ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜์ž.

ํ…Œ์ŠคํŠธ์—์„œ ์ž…๋ ฅํ–ˆ๋˜ ์ •๋ณด์™€ ๋™์ผํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿš€ application.properties
์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„ค์ • ๊ฐ’๋“ค์„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ–์ด๋‚˜ ์•ˆ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
์ด ํŒŒ์ผ์€ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋™ํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋กœ๋”ฉํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค.
key - value ํ˜•์‹์œผ๋กœ ๊ฐ’์„ ์ •์˜ํ•˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐ’์„ ์ฐธ์กฐํ•  ๋• @Value ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

spring.datasource.username=MySQL ์œ ์ € ์ด๋ฆ„
spring.datasource.password=MySQL ๋น„๋ฐ€๋ฒˆํ˜ธ
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ช…?serverTimezone=UTC&allowPublicKeyRetrieval=true

src/main/resources/application.properties

 

์ด์ œ Datasource ์„ค์ •์„ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

  • Datasource
    • ์ปค๋„ฅ์…˜ ํ’€์˜ ์ปค๋„ฅ์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด
    • ์ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ปค๋„ฅ์…˜์„ ํš๋“ ๋ฐ˜๋‚ฉ ๋“ฑ์˜ ์ž‘์—…์„ ํ•œ๋‹ค.

๐Ÿš€ ์ปค๋„ฅ์…˜ ํ’€
๊ธฐ์กด JDBC๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ์žˆ์„๋•Œ๋งˆ๋‹ค DB ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Connection ๊ฐ์ฒด๋ฅผ ์–ป์Œ (์ข‹์ง€ ์•Š๋Š” ์„ฑ๋Šฅ์ด์—ˆ์Œ)
๊ธฐ์กด์˜ ๋ถˆํŽธํ•จ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ.
Connection ๊ฐ์ฒด๋ฅผ ์š”์ฒญ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋น„์Šค ๋˜๊ธฐ ์ „์— ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ ์ค€๋น„ํ•œ ๋‹ค์Œ ํ•„์š”ํ•  ๋•Œ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ฒŒ ํ•œ๋‹ค.

src/main/java/com/project/mong/config/DataSourceConfig.java

src/main/java/ํŒจํ‚ค์ง€/config ๋‚ด์— DataSourceConfig.java๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

@Configuration
public class DataSourceConfig {
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

src/main/java/com/project/mong/config/DataSourceConfig.java

  • @Configurtion
    • ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ๋„์›€
    • ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๊ณ  ํด๋ž˜์Šค ๋‚ด์— ํ•˜๋‚˜ ์ด์ƒ์˜ @Bean ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Bean ์ •์˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์‹œ ๊ทธ Bean ๋“ค์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์„ ์„ ์–ธํ•œ๋‹ค.
  • @ConfigurationProperties
    • ์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ ์™ธ๋ถ€ ์„ค์ • ํŒŒ์ผ(application.properties)์„ ์ฐธ์กฐํ•  ๋•Œ ์“ฐ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.(ex. @Value)
    • application.properties์˜ key๋ฅผ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋‘๋ฉด(์ ‘๋‘์–ด), ์ด๋ฅผ ๋ฌถ์–ด์„œ Bean์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. (์—ฌ๊ธฐ์„  spring.datasource๋กœ ๊ตฌํ˜„ํ•ด๋’€์Œ)
    • ์ฆ‰, ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ prefix = "spring.datasource" ๋ผ๊ณ  ํ•˜๋ฉด spring.datasource๊ฐ€ ์ ‘๋‘์–ด๋กœ ๋ถ™์–ด ์žˆ๋Š” application.properties ๊ฐ’๋“ค์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ @Bean์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ์— ๋ถ™์—ฌ์ฃผ๋ฉด ์จ๋“œํŒŒํ‹ฐ ์ปดํฌ๋„ŒํŠธ(์—ฌ๊ธฐ์„  Datasource) ์— ๋ฐ”์ธ๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฆ‰, Datasource๊ฐ€ application.properties์— spring.datasource ๋กœ ์‹œ์ž‘๋˜๋Š” ๊ฐ’๋“ค์„ ์ฐธ์กฐํ•ด์„œ ์“ด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿš€ ์จ๋“œํŒŒํ‹ฐ ์ปดํฌ๋„ŒํŠธ
3rd Party
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋„์™€์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
ํ˜„์žฌ ํŒ€ ์ธ์› ์™ธ์˜ ์ œ 3์ž๊ฐ€ ๊ฐœ๋ฐœํ•œ ๋„๊ตฌ

์ฐธ๊ณ ๋กœ application.properties์™€ ConfigurationProperties ์กฐํ•ฉ์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

@Bean
public DataSource dataSource() {
    return DataSourceBuilder
        .create()
        .username("MySql ์œ ์ € ์ด๋ฆ„")
        .password("MySql ๋น„๋ฐ€๋ฒˆํ˜ธ")
        .url("MySql ๊ฒฝ๋กœ")
        .driverClassName("com.mysql.cj.jdbc.Driver")
        .build();
}

 

์ด์ œ ์•ž์„œ ์„ค์ •ํ•ด์ค€ DataSource๋ฅผ ์ฐธ์กฐํ•ด MyBatis์™€ Mysql์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…์„ ํ•  ๊ฒƒ์ด๋‹ค.

src/main/java/ํŒจํ‚ค์ง€/config ๋‚ด์— MySQLConfig.java๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

@Configuration
@MapperScan ("com.project.mong.dao")
public class MySQLConfig {


    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/*.xml"));

        Resource myBatisConfig = new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml");
        sessionFactory.setConfigLocation(myBatisConfig);

        return sessionFactory.getObject();
    }
}

src/main/java/com/project/mong/config/MySQLConfig.java

  • @MapperScan
    • ์—ฐ๊ฒฐํ•  DAO ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ด์€ ํŒจํ‚ค์ง€๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
    • @MapperScan(basePackages = {"com.project.mong.dao"}) ๋ผ๊ณ  ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • SqlSessionFactory
    • MySql๊ณผ MyBatis๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฐ์ฒด
  • SqlSessionFactoryBean
    SqlSessionFactory๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ํด๋ž˜์Šค
  • setDataSource()
    • ์•ž์„œ ์ •์˜ํ•œ datasource๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ํ•œ๋‹ค.
  • PathMatchingResourcePatternResolver
    • resource ์œ„์น˜ ๊ฒ€์ƒ‰์„ ๋•๋Š” Spring class
    • getResources() ๋กœ ๊ฒฝ๋กœ ๊ฒ€์ƒ‰์„ ํ•ด SqlSessionFactory์— mapper ์™€ mybatis-config๋ฅผ setํ•ด์ค€๋‹ค.
  • classpath
    • resource ํด๋”๋ฅผ ๋‚˜ํƒ€๋ƒ„

์—ฌ๊ธฐ์„œ ์–ธ๊ธ‰ํ•œ mybatis-config๋Š” ๋ง ๊ทธ๋Œ€๋กœ Mybatis ์„ค์ • ํŒŒ์ผ์ด๋‹ค.
์—†์–ด๋„ ๊ดœ์ฐฎ์€ ํŒŒ์ผ์ด์ง€๋งŒ Mybatis ์„ค์ •์„ ์œ„ํ•ด ์ƒ์„ฑํ•ด์ฃผ๋Š” ํŽธ์ด ์ข‹๋‹ค.

๋‚˜๋Š” resource ํด๋” ์•„๋ž˜์— mybatis-config.xml์„ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•ด์คฌ๋‹ค.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true" />
        <setting name="callSettersOnNulls" value="true"/>
    </settings>
</configuration>

src/main/resources/mybatis-config.xml

  • mapUnderscoreToCamelCase
    • Mybatis์˜ DTO(VO) ๋ฆฌํ„ด ๊ฐ’์„ Camel Case๋กœ ๋ณ€ํ™˜์‹œํ‚ด
  • callSettersOnNulls
    • ResultType ์ด HashMap ์ผ ๋•Œ ๊ฐ’์ด null ์ธ ๊ฒƒ์ด ๋ˆ„๋ฝ๋˜์–ด ๋‚˜์˜ค๋Š”๋ฐ, null์„ ํฌํ•จ์‹œ์ผœ return ํ•˜๊ฒŒ ํ•œ๋‹ค.

์ด ์™ธ์—๋„ ์—ฌ๋Ÿฌ ์„ธํŒ…์„ ์ถ”๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿงฑ Spring Boot + MyBatis + MySQL ์—ฐ๊ฒฐ ํ™•์ธ ์˜ˆ์ œ

MySQL ์™€ MyBatis๊ฐ€ ์ œ๋Œ€๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž
์„ค์ •ํ•ด ์ค€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์— ํ…Œ์ด๋ธ”์„ create ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ’์„ ๋„ฃ์–ด์คฌ๋‹ค.

create table DB_TEST (
    title varchar(20),
    name varchar(20)
);

insert into DB_TEST values (
    'DB ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค.', 'TEST'
);

MySQL DB ๊ฒฐ๊ณผ

 

DB์— ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์ด์ œ ์ด ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ ์ค„๊ฒƒ์ด๋‹ค.

public class TestDTO {
    String title;
    String name;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/src/main/java/ํŒจํ‚ค์ง€/dto/TestDTO.java

๊ฐ€์ ธ์˜ฌ DTO(์ปฌ๋Ÿผ)์„ ์ž‘์„ฑํ•ด์ฃผ์ž
DTO ๋Š” Data Transfer Object์˜ ์ค„์ž„๋ง๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ๋งคํผ๋กœ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.
DB ๋‚ด ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
getter๋ฅผ ๋น ๋œจ๋ฆฌ๋ฉด ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธฐ๋‹ˆ getter, setter๋ฅผ ๊ผญ ์ž‘์„ฑํ•ด์ฃผ์ž
lombok๋ฅผ ์จ๋„ ์ƒ๊ด€ ์—†๋‹ค.

 

๋‹ค์Œ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ MyBatis ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ด์ค€๋‹ค
MyBatis๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฌธ์„ ์ง๊ด€์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์žฅ์ ์ด๋‹ค.

<?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 namespace="com.project.mong.dao.TestDAO">
    <select id="getTestData" resultType="com.project.mong.dto.TestDTO">
        select
            title,
            name
        from
            DB_TEST
    </select>
</mapper>

src/main/resources/mappers/TestMapper.xml

MyBatis mapper ํŒŒ์ผ์€ ๋‹ค๋ฅธ ์ž๋ฐ” ํŒŒ์ผ๊ณผ ๋‹ฌ๋ฆฌ resources ํด๋” ๋‚ด์— ์œ„์น˜ํ•œ๋‹ค
์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ MySQLConfig ํŒŒ์ผ์—์„œ ์ด ๊ฒฝ๋กœ์— mapper ํŒŒ์ผ์„ ๋„ฃ๊ฒ ๋‹ค๊ณ  ์„ค์ •ํ•ด ์คฌ์—ˆ๋‹ค.

sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/*.xml"));

์—ฌ๊ธฐ์„œ classpath ๋Š” /src/main/resources๋ฅผ ์˜๋ฏธํ•˜๋Š”๋ฐ, Interllij ๊ฐ™์€ ๊ฒฝ์šฐ
ctrl + shift + alt+ s ๋˜๋Š” File - Project Structure์—์„œ
Modules - Sources ๋ถ€๋ถ„์—์„œ ์‰ฝ๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.
classpath๋กœ ๋‘๊ณ ์žํ•˜๋Š” ํŒŒ์ผ์„ ์„ ํƒ ํ›„ Mark as: ๋ฅผ Resources๋กœ ์ ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
์•„๋งˆ ๊ธฐ๋ณธ์ ์œผ๋กœ /src/main/resources๊ฐ€ classpath๋กœ ์„ค์ •๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

์œ„ ์ฝ”๋“œ์—์„œ ์ฃผ๋ชฉํ•ด์•ผํ•  ์ ์€ namespace์ด๋‹ค.
namespace์—” ์ด mapper ํŒŒ์ผ๊ณผ ์—ฐ๋™๋  DAO๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
DAO๋Š” Data Access Object์˜ ์•ฝ์ž๋กœ, DB์— ์ ‘๊ทผํ•  ์ธํ„ฐํŽ˜์ด์Šค๋“ค์ด ์„ ์–ธ๋  ๊ฒƒ์ด๋‹ค.

package com.project.mong.dao;

import com.project.mong.dto.TestDTO;
import java.util.List;

public interface TestDAO {
    List<TestDTO> getTestData();
}

src/main/java/com/project/mong/dao/TestDAO.java

List<TesDTO> ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์งœ์คฌ๋‹ค.
์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์— ์ •์˜๋˜์–ด mapper์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ mapper์˜ getTestData์™€ ๋ฉ”์†Œ๋“œ ๋ช…์ด
๋™์ผํ•ด์•ผํ•œ๋‹ค.

๋‹ค์Œ์€ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์งœ์ค„ ๊ฒƒ์ด๋‹ค.

package com.project.mong.controller;

import com.project.mong.dao.TestDAO;
import com.project.mong.dto.TestDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/api")
public class DBConnectTestCtrl {

    @Autowired
    private TestDAO testDAO;

    @GetMapping("/hello")
    public List<TestDTO> HelloWorld() {
        return testDAO.getTestData();
    }
}

src/main/java/com/project/mong/controller/DBConnectTestCtrl.java

@Autowired๋กœ DAO๋ฅผ ์ฃผ์ž…ํ•˜๊ณ 
List<TestDTO>๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์งœ์คฌ๋‹ค. ์ด๋Š” /api/hello๋กœ ์ ‘๊ทผํ•˜๋ฉด ์‹คํ–‰ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

localhos:8080/api/hello ๊ฒฐ๊ณผํ™”๋ฉด

DB ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ์ˆ˜ ์žˆ์—ˆ๋‹ค!๐ŸŽ‰


์ง€๊ธˆ๊นŒ์ง€ Spring Boot + MyBatis + MySQL์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.
ํ”ผ๋“œ๋ฐฑ ๋Œ“๊ธ€์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค! ๐Ÿ‘ผ

'Spring > Spring Boot' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Boot Maven + Nuxt.js ์—ฐ๋™ํ•˜๋Š” ๋ฒ• (CORS, Proxy)  (0) 2021.04.02

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | ์ž๊ธฐ๊ณ„๋ฐœ | ๋ฏธ๋ผํด ๋ชจ๋‹ | ์ผ์ƒ