[Spring] 스프링 부트 첫걸음 3 : REST API에 데이터베이스 연동 (MySQL, MyBatis)
** 해당 글은 하단 참고란의 영상을 보고 따라서 공부하며 기록한 글입니다.
이전글과 이어집니다.
이전글에서
get, post, put, delete 를 사용해 api를 만들어봤으니
실제 데이터베이스와 연결해보자!
MySQL 데이터베이스 준비
- mysql Workbench이용해 스키마 생성하기
스키마는 utf-8로 설정한다.
- 데이터베이스(스키마)에 테이블을 만들자.
mysql workbench 사용해 새 SQL쿼리 탭을 열고
테이블은 클래스명과 동일하게, 컬럼들은 필드명들과 동일하게 한다.
use spring_first;
create table UserProfile (
id varchar(64) PRIMARY KEY,
name varchar(64),
phone varchar(64),
address varchar(256)
);
-- 쿼리로 확인
select * from userprofile;
네비게이션 창에서는 바로 반영이 안되고
저기 있는 새로고침 버튼을 눌러줘애 확인 가능.
STS와 MySQL 연결 1 - dependency들 추가, 설정
- STS에 dependency 추가
프로젝트의 pom.xml 파일에 추가하면 된다.
mysql과 SQL 매핑을 위해 mybatis를 추가할 것이다.
maven타입으로 만든 프로젝트이므로
maven 리파지토리에서 검색한다. https://mvnrepository.com/
mysql 을 검색하면 나오는
- MySQL Connector/J 의 최신버전을 클릭해 maven코드를 pom.xml 에 추가
다른 dependency들 옆에 추가하면 된다.
저장하면 해당 dependency가 다운로드되고 프젝에 포함된다.
이 때, 버전부분은 노란줄이 뜨며 이는 삭제하는 것이 좋다.
스프링부트는 현재 자기 버전에 맞는 mysql버전으로 알아서 관리하기 때문에
우리가 지정해주지 않는 것이 일반적이라고 한다.
이제 mybatis를 검색함
- MyBatis Spring Boot Starter 의 최신버전을 추가함
MyBatis Spring Boot Starter는 MyBatis, MyBatis Spring 을 포함하고 MyBatis Spring Boot AutoConfigure 이라는 라이브러리도 포함하고 있다. 이는 DB와 연결된 설정들까지 자동화해준다.
우리는 실제 접속하기 위한 DB주소, id, password만 설정해주면 된다.
- 실제 접속하기 위한 DB주소, id, password를 설정해주자.
STS에서
src>main>properties 폴더의 application.properties 파일에 설정한다.
spring.datasource.url=jdbc:mysql://localhost:<포트번호>/<DB이름>?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul
spring.datasource.username=<계정이름>
spring.datasource.password=<계정비밀번호>
DB이름 뒤에 붙는 내용은 일반적인 설정 내용이라고 한다.
STS와 MySQL 연결 2 - Mapper 만들기
mybatis가 SQL 매핑을 위한 도구라고 했으니
매핑을 수행할 내용을 담은 Mapper가 필요하다.
- Mapper를 모아둘 패키지를 새로 만든다.
패키지명은 com.example.demo.mapper
- 이 패키지에 UserProfile관련 Mapper로 사용할 interface를 하나 만든다.
이름은 UserProfileMapper.java
interface선언 바로 위에 @Mapper 라는 어노테이션을 달아준다.
이러면 스프링이 이 인터페이스를 Mapper로 인식해서 사용한다.
인터페이스의 내용을 작성한다.
이전에 만들었던 컨트롤러의 getUserProfile 함수를 참고해서 아래 내용과 같이 쓴다.
@Select("SELECT * from UserProfile WHERE id=#{id}")
UserProfile getUserProfile(@Param("id") String id;
getUserProfile를 호출했을 때 @Select에 있는 SQL문이 실행되어 UserProfile형태로 데이터를 가져온다.
여기서 파라미터와 id를 연결할 때는 ${}가 아니라 #{}로 표시해야 한다.
다른 작업들도 컨트롤러를 참고해 똑같이 작성해준다.
select와 달리 insert, update, delete 는 결과로 int값 즉 이 SQL문으로 영향을 받은 레코드 개수가 반환되도록 작성한다.
이 때, insert, update의 함수명은 SQL문과 유사하게 가는 것이 좋으므로
post, put대신 각각 insert, update로 바꿔준다.
@Insert("INSERT INTO UserProfile VALUES(#{id}, #{name}, #{phone}, #{address})")
int insertUserProfile(@Param("id") String id, @Param("name") String name, @Param("phone") String phone, @Param("address") String address);
@Update("UPDATE UserProfile SET name=#{name}, phone=#{phone}, address=#{address} WHERE id=#{id}")
int updateUserProfile(@Param("id") String id, @Param("name") String name, @Param("phone") String phone, @Param("address") String address);
여기까지 인터페이스 전체 코드는 아래와 같다.
UserProfileMapper.java
package com.example.demo.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.example.demo.model.UserProfile;
//Mapper를 만듦
@Mapper
public interface UserProfileMapper {
//getUserProfile를 호출했을 때 이 SQL문이 실행되어 UserProfile형태로 데이터를 가져옴
@Select("SELECT * from UserProfile WHERE id=#{id}") //파라미터와 id를 연결할 때는 $가 아니라 #로 표시해야 함.
UserProfile getUserProfile(@Param("id") String id);
@Select("SELECT * from UserProfile")
List<UserProfile> getUserProfileList();
//insert, update, delete 는 결과로 int값 즉 이 SQL문으로 영향을 받은 레코드 개수가 반환됨.
@Insert("INSERT INTO UserProfile VALUES(#{id}, #{name}, #{phone}, #{address})")
int insertUserProfile(@Param("id") String id, @Param("name") String name, @Param("phone") String phone, @Param("address") String address);
@Update("UPDATE UserProfile SET name=#{name}, phone=#{phone}, address=#{address} WHERE id=#{id}")
int updateUserProfile(@Param("id") String id, @Param("name") String name, @Param("phone") String phone, @Param("address") String address);
@Delete("DELETE from UserProfile WHERE id=#{id}")
int deleteUserProfile(@Param("id") String id);
}
STS와 MySQL 연결 3 - Controller에서 Mapper사용
이렇게 만든 Mapper를 Controller에서 사용하자.
UserProfileController.java 파일로 가서
Controller 생성자에서 mapper를 전달받아
Controller의 private 변수로 설정하도록 만들자.
원래 userMap 선언만 있던 자리가 다음과 같이 바뀐다. 더이상 쓰지 않을 userMap은 주석처리했다.(지워도 된다)
private UserProfileMapper mapper;
//private Map<String, UserProfile> userMap;
//생성자. mapper를 전달받아서 private변수에 설정함.
public UserProfileController(UserProfileMapper mapper) {
this.mapper = mapper; //전달받은 mapper 로 api를 호출 가능.
}
@PostConstruct가 달려있던 init()함수도 더이상 쓰지 않으므로 지워도 된다.
그리고 모든 함수에서 userMap대신 mapper를 사용해 값을 설정하도록 바꾼다.
getUserProfile을 예시로 다음과 같이 바꾼다. userMap을 사용하던 코드는 주석처리했다.
@GetMapping("/user/{id}")
public UserProfile getUserProfile(@PathVariable("id") String id) {
//return userMap.get(id); //id값을 이용해 UserProfile반환
return mapper.getUserProfile(id);
}
return문에서 userMap대신 mapper의 함수인 getUserProfile를 사용해 작업을 처리했다.
다른 함수들도 이런식으로 처리해준다.
여기까지 컨트롤러 전체 코드이다.
UserProfileController.java
package com.example.demo.controller;
import java.util.List;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.mapper.UserProfileMapper;
import com.example.demo.model.UserProfile;
@RestController
public class UserProfileController {
private UserProfileMapper mapper;
//생성자. mapper를 전달받아서 private변수에 설정함.
public UserProfileController(UserProfileMapper mapper) {
this.mapper = mapper; //전달받은 mapper 로 api를 호출 가능.
}
@GetMapping("/user/{id}")
public UserProfile getUserProfile(@PathVariable("id") String id) {
return mapper.getUserProfile(id);
}
@GetMapping("/user/all")
public List<UserProfile> getUserProfileList() {
return mapper.getUserProfileList();
}
//데이터 생성
@PostMapping("/user/{id}")
public void postUserProfile(@PathVariable("id") String id, @RequestParam("name") String name, @RequestParam("phone") String phone, @RequestParam("address") String address) {
mapper.insertUserProfile(id, name, phone, address);
}
//데이터 수정
@PutMapping("/user/{id}")
public void putUserProfile(@PathVariable("id") String id, @RequestParam("name") String name, @RequestParam("phone") String phone, @RequestParam("address") String address) {
mapper.updateUserProfile(id, name, phone, address);
}
//데이터 삭제
@DeleteMapping("/user/{id}")
public void deleteUserProfile(@PathVariable("id") String id) {
mapper.deleteUserProfile(id);
}
}
작성이 모두 끝났다!
서버를 작동시키고 테스트해보자.
Postman으로 테스트
Postman사용법은 이전글 참고
POST, GET, PUT, DELETE 모두 200 OK가 뜨고 정상적으로 조회도 되고
MySQL Workbench로 확인해봐도
잘 작동함을 알 수 있었다.
성공!!
다음에는 로컬이 아니라 실제로 AWS를 사용해 서버를 올려보자.
다음글
참고 https://www.youtube.com/watch?v=QzHkJsALmyw&list=PLvdZg8T1CFZuMZh5PzNUAhDprr0ksjkNp&index=9