
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
'덕개' 카테고리의 다른 글
| [Vue.js] 엑셀(Excel) 다운로드 기능 구현하기 ExcelJS, file-saver (0) | 2023.02.10 |
|---|---|
| [Javascript] var , let , const 차이 (ES5, ES6) (0) | 2023.01.19 |
| [음악 장르] 01. 컨트리 뮤직(Country Music) - 카우보이 캡, 블루진 그리고 가죽부츠 (2) | 2022.10.29 |
| [Json/Java Serializer] 이슈해결 - No serializer found for class... (0) | 2022.07.04 |
| 스프링부트(Spring Boot) 로 RESTful한 API를 만들어보자 (1) - 간단설명, 환경설정 (0) | 2021.10.18 |