덕개

스프링부트(Spring Boot) 로 RESTful한 API를 만들어보자 (2) - 디비연결, 데이터가져오기

Always2024 2021. 10. 31. 21:01

 

1. DB연결

자 이제 본격적으로 CRUD를 하기위해 디비연결을 하자.

사용할 DBMS는 MySQL 이지만 MariaDB, Oracle 뭐든 다 상관없다.

 

먼저, pom.xml에서 DB연결에 필요한 라이브러리를 설치한다.

아 귀찮으면 아래 코드 복붙하라고 ㅋㅋ

 

더보기

<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

1-1. 연결 확인

위처럼 연결은 했지만 중요한건 항상 테스트를 해보는거다.

스프링의 장점은 테스트환경이 잘 구성된다는 점이지

src/test/java 폴더로 가서 MySQLConnectionTest.java 를 만들어주자

application.properties 에서 디비환경을 설정했지만, 테스트파일에서 다시 해야한다.

 

아래 코드를 작성해보자.

복붙코드는 아래 더보기 확인~

더보기

package com.example.demo;

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

import org.junit.jupiter.api.Test;

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/restapitest?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false";
    private static final String USER = "root";
    private static final String PASSWORD = "tkdlek12";
    
    
    @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();
        }
    }

}

이렇게 출력되면 성공

만약 에러가 발생한다면 거의 오타문제임 DB유저네임, 비밀번호, 포트번호 를 확인

 

 


참고 : JUnit 실행방법

Window > Show view > JUnit

 


1-2. DB정보 입력

src/main/resources > application.properties 로 이동해서 아래 코드를 붙여넣기 하자.

복붙코드 아래 확인

더보기

spring.datasource.username=[DB유저네임]
spring.datasource.password=[DB패스워드]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/restapitest?

serverTimezone=UTC&allowPublicKeyRetrieval=true

디비 접속계정과 비밀번호, 포트번호 잘 확인하고 넣어야 한다.

 

 

이제 본격적으로 설정을 뚝딱 마치고 CRUD의 R(read)를 해보자.

 

먼저 패키지구성은

- config : DB관련 추가설정을 위한 파일, 보통 xml 파일로도 많이하는데 여기선 java파일로 해보겠다.

 

나머진 MVC 기본패턴을 따라가고 있다.

 

 

- DataSourceConfig.java

복붙코드는 아래 더보기 확인

 

@Configuration :

 어노테이션 기반 환경 구성을 도와준다. 이 어노테이션을 붙이고 클래스 내에 하나 이상의 @Bean 메소드를 구현하면 스프링 컨테이너가 Bean 정의를 생성하고 런타임 시 그 Bean들의 요청을 처리할 것을 선언함.

@ConfigurationProperties(prefix = "spring.datasource") :

 외부 설정파일(application.properties)을 참조할 때 쓰는 방법 중 하나이다. (ex. @Value)

application.properties의 key를 같은 값으로 시작하게 구현해두면 (접두어), 이를 묶어서 Bean으로 등록할 수 있다.

여기선 spring.datasource로 구현했음.

즉, prefix = "sprin.datasource" 라고 하면, spring.datasource가 접두어로 붙어 있는 application.properties 값들을 참조할 수 있다.

이 어노테이션을 @Bean이 붙은 메소드에 붙여주면 써드파티 컴포넌트(Datasource)에 바인딩을 할 수 있음.

한마디로 Datasource가 application.properties에 spring.datasource로 시작하는 값들을 참조해서 쓴다는 것.

더보기

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

 

@Configuration
public class DataSourceConfig {

 

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

}

 

- MySQLConfig.java

자세한 설명은 주석으로 대체한다.

아 이제 진짜 진짜로 디비관련 설정은 모두 끝이라고 ㅋㅋㅋ

 

자 이제 CRUD의 꽃인 SELECT를 하기 위해 DB 데이터를 생성해보자.

 

아래 더보기를 클릭하여 코드를 복사한 다음 DBMS에서 실행하자

TABLE 생성하고 읽기위한 데이터를 입력한다.

더보기

CREATE TABLE members(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20) NULL DEFAULT NULL,
age INT NULL DEFAULT NULL,
dept VARCHAR(20) NULL DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
);

 

INSERT INTO members (NAME, age, dept) VALUES ("Captain America", 102, "Super Soldier");
INSERT INTO members (NAME, age, dept) VALUES ("Iron Man", 53, "Engineer");
INSERT INTO members (NAME, age, dept) VALUES ("Thor", 1500, "God of Thunder");

 

2. 본격적으로 데이터 불러오기

- mapper.xml

src/main/resources 아래에 mappers 폴더를 만들고 mapper.xml 파일을 만들어두자.

여기는 DB에 날릴 쿼리를 작성한다..

아까 insert 했으니 바로 select ㄱㄱ

복붙코드 아래 더보기 확인~

더보기

<?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.example.demo.dao.TestDAO">
    <select id="getTestData" resultType="com.example.demo.dto.TestDTO">
        select
            title,
            name
        from
            DB_TEST
    </select>
    
    <select id="getAllMembers" resultType="com.example.demo.dto.Member">
select * from members
</select>

</mapper>

 

 

- TestDAO.java

 

- MembersService.java

이제 컨트롤러가 받은 요청 데이터를 이용해 내부 로직을 수행할 서비스를 작성해야 한다.

서비스는 인터페이스를 먼저 작성한 다음 이 인터페이스를 구현한 클래스를 다시 작성해야한다.

 

- MembersServiceImpl.java

본격적으로 로직이 수행될 ServiceImpl 이지만 우리는 데이터만 가져오기 위해 바로 리턴해주도록 한다.

 

- TestController

여기서 중요한것은

클래스 선언부의 @Controller 가 아닌 @RestController

메소드 선언부의 @RequestMapping 이 아닌 @GetMapping

 

@RestController : Json 형태로 객체를 반환하겠다는 뜻이다.

보통 Spring Framework 에서 주로 사용하는 @Controller 어노테이션은 String 타입으로 클라이언트에게 보여줄 페이지를 반환하지만, REST API는 페이지를 반환하는 것이 아니라 클라이언트가 요청한 데이터만 반환하는것이 포인트이다.

 

지금은, 일단 JSON 형태로 객체를 바로 반환했지만, 실무에선 ResponseEntity 를 사용한다.

ResponseEntity 를 사용하면, 응답 처리 과정 측면에서 훨씬 다양한 기능을 사용할 수 있다.

(여기선 중요하지 않으므로 궁금하면 구글링)

 

@GetMapping (그 외, @PostMapping, @PutMapping, @DeleteMapping) : 클라이언트로부터 Get요청이 들어올때 해당 메서드가 실행된다.

예를들어 같은 '/members' 로 요청이 들어왔지만 해당 요청이 어떤 타입이냐에 따라 수행되는 메서드가 달라진다.

 

 

데이터 확인

서버 기동

서버 기동해서 해당 요청 url을 호출해보자.

 

컨트롤러에서 url 매핑을 '/members'로 잡았으니 위와같이 호출해주면?

구웃. 데이터가 잘 호출되었다.

 

지금은 RESTful에 대한 이해를 위해 데이터를 그대로 가져온 것이다.

이를 프론트단에선 axios나 ajax로 호출해서 Json형태로 받은 다음 데이터를 화면에 알맞게 뿌려주는 작업을 한다.

 

남은 포스팅 : @PostMaping, @PutMapping, @DeleteMapping