Web

2. Spring Boot - MySQL/MyBatis 연동

kakaroo 2022. 2. 3. 13:55
반응형

article logo

 

앞에서 생성한 WAS의 UserProfile Data를 MySQL 과 MyBatis 를 사용하여 database로 저장해 보겠습니다.

:: https://kakaroo.tistory.com/14?category=1001571

 

MyBatis ? https://kakaroo.tistory.com/16

 

MyBatis

MyBatis는? 쿼리 기반 웹 애플리케이션을 개발할 때 가장 많이 사용되는 SQL 매퍼(Mapper) 프레임워크입니다. 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도

kakaroo.tistory.com

1. 라이브러리 Dependency 추가 필요

 - MySQL 라이브러리

 - Database 연동을 위해 사용할 SQLMapping 기술을 제공하는 MyBatis dependency

 

Spring Boot Project 를 Maven으로 만들었기 때문에  pom.xml 에 maven에 맞는 dependency를 추가해야 합니다.

 (* pom 을 수정하면 서버를 재실행 해야 합니다.)

 

1.1 https://mvnrepository.com/ 에서 MySQL dependency를 검색

 

최신버전을 선택해 아래 dependency 내용을 복사해서 pom.xml에 붙여줍니다.

아래 version tag에 경고가 발생하는데, Spring Boot가 버전을 직접 관리하므로 아래 버전태그는 삭제하면 됩니다.

 

1.2 MyBatis 역시 검색해서 추가해 줍니다. (MyBatis Spring Boot Starter 를 선택)

MyBatis Spring Boot Starter 에는 autoconfigure lib가 있는데,

database와 연동과 관련된 설정들을 모두 자동화 해주는 역할(DB를 사용하기 위해서는 DB에 물리적인 연결을 관리하는 data source, SQL session 생성, SQL session template 생성 후 모두 설정해야 함)을 합니다.

 

 

1.3 database에 접속할 주소, ID, PW를 설정하기 위해 application.properties 에 아래 값을 추가합니다.

-> 데이터베이스 이름과 해당 데이터베이스에 권한이 있는 user/user pw가 포함됩니다.

spring.datasource.url=jdbc:mysql://localhost:3306/kakaroodb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul
spring.datasource.username=kakaroo
spring.datasource.password=kakaroo11

1.4 Database 생성 (설치한 MySql 에서 직접 생성합니다)

> CREATE DATABASE kakaroodb default CHARACTER SET UTF8

> use kakaroodb

Table 생성.

> create table UserProfile (id varchar(64) PRIMARY KEY, name varchar(64), phone varchar(64), address varchar(255))

잘 생성되었는지 확인.

> select * from UserProfile

 

계정/비번 생성.
create user 'user명'@'server명' identified by 'password' 

DB access 등의 모든 권한 부여.

> grant all privileges on *.* to 'kakaroo'@'localhost'    //*.* : database명.table명 을 의미함.

> flush privileges

 

 

* 간단한 SQL 명령어
계정 생성
create user 'user명'@'server명' identified by 'password' 
계정 삭제
drop user [user명]@[server명]
생성한 계정으로 로그인
mysql -u kakaroo -p

show databases
use [dbName]
show tables status
MySQL에 root로 접속 한 뒤
use mysql;
select host, user from user;
현재 생성된 db의 사용자 계정들을 확인할 수 있다.

사용자 계정 생성
GRANT USAGE ON [database명].[table명] TO [user명]@[server명] IDENTIFIED BY ['패스워드'];
ex) grant usage on database.* to user1@localhost identified by 'user1';

생성된 사용자 계정 권한 설정
GRANT ALL ON [database명].[table명] TO [user명]@[server명];    =>  모든 권한을 준다
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER ON [database명].[tabel명] TO [user명]@[server명];
   => 특정 권한을 준다
ex) grant all on database.* to user1@localhost;
     grant select,insert,update,delete,create,drop.index,alter on database.* to user1@localhost;

권한 적용(반드시 해야 함)
>flush privileges

권한 보기
> show grants for user@host

REVOKE ALL ON [database명].[table명] FROM [user명]@[server명];    =>  모든 권한을 삭제한다
REVOKE DROP ON
 [database명].[table명] FROM [user명]@[server명];    => 특정 권한(drop)을 삭제한다
ex) revoke all on database.* from user1@localhost;
     revoke drop,index on database.* from user1@localhost;

 

2. Database data를 관리할 mapper 패키지를 생성합니다.

3. DB operation 을 수행하는 interface mapper를 정의합니다.

 // mapper 는 xml 로 설정할 수도 있고, 코드에서 annotation을 설정해서 사용할 수도 있습니다. 프로그래머의 스타일에 따라...

package com.example.project.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.project.model.UserProfile;

@Mapper
public interface UserProfileMapper {
	@Select("SELECT * FROM UserProfile WHERE id=#{id}")
	UserProfile getUserProfile(@Param("id") String id);
	
	@Select("SELECT * FROM UserProfile")
	List<UserProfile> getUserProfileList();
	
	@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);
}

4. 기존의 Controller에서 사용한 HashMap 대신 mapper의 메소드로 변경해줍니다.

@RestController
public class UserProfileController {
	//private Map<String, UserProfile> userMap;
	private UserProfileMapper mapper;
	
	public UserProfileController(UserProfileMapper mapper) {
		this.mapper = mapper;
	}
	
	/*@PostConstruct
	public void init() {		
		  userMap = new HashMap<String, UserProfile>(); userMap.put("1", new
		  UserProfile("1", "홍길동", "111-1111", "서울시 강남구 대치1동")); userMap.put("2", new
		  UserProfile("2", "홍길서", "222-2222", "서울시 강남구 대치2동")); userMap.put("3", new
		  UserProfile("3", "홍길남", "3333-3333", "서울시 강남구 대치3동"));		 
	}*/
	
	@GetMapping("/user/{id}")	//localhost:8080/user/id
	public UserProfile getUserProfile(@PathVariable("id") String id) {
		return mapper.getUserProfile(id);
		//return userMap.get(id);		
	}
	
	@GetMapping("/user/all")
	public List<UserProfile> getUserProfileList() {
		return mapper.getUserProfileList();
	    //return new ArrayList<UserProfile>(userMap.values());
	}
	
	@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);
	    //UserProfile userProfile = new UserProfile(id, name, phone, address);
	    //userMap.put(id, userProfile);
	}
	
	@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);
	    //UserProfile userProfile = userMap.get(id);
	    //userProfile.setName(name);
	    //userProfile.setPhone(phone);
	    //userProfile.setAddress(address);
	}
	
	@DeleteMapping("/user/{id}")
	public void deleteUserProfile(@PathVariable("id") String id) {
		mapper.deleteUserProfile(id);
	    //userMap.remove(id);
	}
}

 

5. 실행 화면은 아래와 같습니다.

 

5.1 POST

5.2 POST 3개 더....

5.3 PUT

5.4 DELETE

 

Source : https://github.com/kakarooJ/Test_SpringBoot

 

GitHub - kakarooJ/Test_SpringBoot

Contribute to kakarooJ/Test_SpringBoot development by creating an account on GitHub.

github.com

 


POM은 Project Object Model 의 약자로 이름 그대로 Project Object Model의 정보를 담고있는 파일.
이 파일에서 주요하게 다루는 기능들은 다음과 같습니다.
-프로젝트 정보 : 프로젝트의 이름, 개발자 목록, 라이센스 등
-빌드 설정 : 소스, 리소스, 라이프 사이클별 실행한 플러그인(goal)등 빌드와 관련된 설정
-빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
-POM연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등

Maven이란?

프로젝트를 진행하게 되면 단순히 자신이 작성한 코드만으로 개발하는 것이 아니라 많은 라이브러리들을 활용해서 개발을 하게 됩니다. 이 때 사용되는 라이브러리들의 수가 수십개가 훌쩍 넘어버리는 일이 발생해 이 많은 라이브러리들을 관리하는 것이 힘들어지는 경우가 종종 발생하곤 합니다. Maven은 이러한 문제를 해결해 줄수 있는 도구입니다.
Maven은 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운 받아줍니다.

Maven은 프로젝트의 전체적인 라이프사이클을 관리하는 도구이며, 많은 편리함과 이점이 있어 널리 사용되고 있습니다. 기존에는 Ant가 많이 사용되었지만 Maven이 Ant를 넘어서 더 많은 개발자들이 사용하게 되었고 비교적 최근에는 Gradle이 새롭게 나와 사용되고 있습니다.

Maven은 JDK설치와 같이 설치할 수 있습니다. 환경변수 잡아주고 하면 cmd에서 mvn –version을 통해 버전을 알 수 있고 설치가 가능하다. 설치는 메이븐 홈페이지 에서 할 수 있습니다.

 

Gradle이란?

Gradle이란 기본적으로 빌드 배포 도구(Build Tool)입니다.
안드로이드 앱을 만들때 필요한 공식 빌드시스템이기도 하며 JAVA, C/C++, Python 등을 지원합니다.
빌드툴인 Ant Builder와 그루비 스크립트를 기반으로 구축되어
기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용가능합니다.

기본 메이븐의 경우 XML로 라이브러리를 정의하고 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리등의 항목을 설정 할 수 있습니다.

장점으로는 스크립트 언어로 구성되어 있기때문에, XML과 달리 변수선언, if, else, for등의 로직이 구현가능하여 간결하게 구성 가능합니다.

라이브러리 관리 : 메이븐 레파지토리를 동일하게 사용할 수 있어서 설정된 서버를 통하여 라이브러리를 다운로드 받아 모두 동일한 의존성을 가진 환경을 수정할 수 있습니다.
자신이 추가한 라이브러리도 레파지토리 서버에 올릴 수 있습니다.

프로젝트 관리 : 모든 프로젝트가 일관된 디렉토리 구조를 가지고 빌드 프로세스를 유지하도록 도와줍니다.

단위 테스트 시 의존성 관리 : junit 등을 사용하기 위해서 명시합니다.

 

반응형

'Web' 카테고리의 다른 글

Spring Boot 기본 (공사중..)  (0) 2022.02.05
3. Spring Boot - MyBatis  (0) 2022.02.03
1. Spring Boot - Starter Application by Eclipse(간단한 API 서버)  (2) 2022.02.02
JSP parameter 처리  (0) 2022.02.02
Front Controller Pattern  (0) 2022.02.01