본문 바로가기
SPRING BOOT

Spring boot <-> MySQL 연동하기

by kmyobin 2022. 10. 8.

spring boot 작업 환경 : intellij

mysql 작업 환경 : mysql workbench


https://www.youtube.com/c/GenuineCoder

 

Genuine Coder

This channel is dedicated to those who love and enjoy computer programming. A Wide Variety of videos are added (and will be) including programming tutorials, UI design concepts - implementation, how-to videos, etc. This channel was started in 2016 with Jav

www.youtube.com

인도 아저씨 코딩 참 잘하시네요

그대로 따라하지만 까먹을까봐 적어놓는 글입니다.

 

 

우선 나는 한이음 프로젝트 때문에 amazon rds를 이용하여 mysql database를 만들었다.(연결은 친구가)

나는 spring boot안드로이드 앱mysql database를 연결해줄 것이다.

 

1. spring initializr로 프로젝트 생성

https://start.spring.io/

저렇게 설정하시고 이름은 마음에 드는 거 적고 Generate 고고

저는 springserver라고 이름 지었습니다.

 

압축 풀어서 Intellij에서 열어줍니다.

 

 

 

2. 기본 환경 세팅

build.gradle로 가서 // new라고 적혀있는 거 적어줍니다. mysql을 쓸 것이기 때문입니다.

 

그 다음 application.properties로가서 내가 만든 mysql database와 연결해야합니다. 해줍니다.

보통 localhost를 적으시는데 저는 rds를 이용했기 때문에 해당하는 곳에 endpoint를 넣어주었습니다.

각자 database 만드실 때 username, password 적어주시면 됩니다.

 

이러면 mysql과 spring boot는 연동이 완료되었습니다.

 

 

 

 

3. 값 CRUD

create, read, update, delete를 해보겠습니다.

model package를 생성하고 그 안에 user package를 생성합니다.

그리고 그 안에 User class를 생성합니다.

package com.example.springserver.model.user;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    //@GeneratedValue(strategy = GenerationType.IDENTITY) // 여기서는 increasing key로 primary key를 자동생성해주지만, 나는 id를 primary key로 생성해줬기 때문에 필요없다
    private String id; // 이게 id
    private String password;
    private String name;
    private int age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

이렇게 적어줍니다. 처음에는 변수명은 userAge, userName 이런 식으로 했더니 mysql에서는 변수명이 user_age, user_name 이런 식으로 바뀌더라구여

그래서 걍 이름은 id, password, name, age로 설정했습니다

인도 아저씨는 

@GeneratedValue(strategy = GenerationType.IDENTITY)

를 넣어주고 id를 자동 생성 하셨지만 저는 실제로 사용자가 입력한 id(ex : kmyobin1012)를 primary key로 받아올 것이기 때문에 주석 처리 해주었습니다.

 

 

UserRepository interface를 생성해줍니다.

package com.example.springserver.model.user;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;


@Repository
public interface UserRepository extends CrudRepository<User, String> { // 우리 primary key는 id인 string
    // crudrepository : create, read, update, delete 할 수 있는 유용한 클래스

}

CrudRepository가 진짜 개사기입니다. 알아서 척척 다 해줍니다. 

귀찮게 Select ,,, Drop ,,, 등등 안해도 됩니다

https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html

 

CrudRepository (Spring Data Core 2.7.3 API)

Returns all instances of the type T with the given IDs. If some or all ids are not found, no entities are returned for these IDs. Note that the order of elements in the result is not guaranteed.

docs.spring.io

여기에 자세한 CrudRepository 설명이 나와있습니다.

save, delete, find 등 아주아주 편리합니다. id 알아내서 삭제도 할 수 있고 아무튼 정말 좋습니다. 

 

 

UserDao class를 생성해줍니다.

package com.example.springserver.model.user;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Streamable;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class UserDao { // auto-writing / Data Access Object
    @Autowired
    private UserRepository repository;


    public void save(User user){
        repository.save(user); // repository 함수가 다 자동으로 해줌
    }

    public List<User> getAllUsers(){
        List<User> users=new ArrayList<>();
        Streamable.of(repository.findAll()).
                forEach(users::add);

        return users;
    }

    public void delete(User user){
        repository.delete(user);
    }

    public void deleyeByid(String id){
        repository.deleteById(id);
    }


}

아까 UserRepository 만들었던 것 가져와 주고, 함수를 만듭니다.

하지만 CrudRepository가 다 해주기 때문에 저희는 할 게 없습니다.

 

 

SpringserverApplication.class도 손봐줍니다.

package com.example.springserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages = "com.example.springserver")
@EnableAutoConfiguration
public class SpringserverApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringserverApplication.class, args);
	}

}

이건 왜 해주는지는 잘 모르겠습니다. ( 아직 필요 없는 듯 )

 

 

 

spring initailzr의 좋은 점은 바로 test만 돌려볼 수 있는 파일이 따로 존재한다는 것입니다.(인도 아저씨 말 번역 한 거라 틀린 걸 수도)

springserver - src - test - java - com.example.springserver - SpringserverApplicationTests로 들어갑니다.

 

 

값이 잘 넣어지고 삭제되는지 볼 겁니다.

package com.example.springserver;

import com.example.springserver.model.user.User;
import com.example.springserver.model.user.UserDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class SpringserverApplicationTests { // 여기서 data 잘 들어가나 test 할 수 있음

	@Autowired
	private UserDao userDao;

	@Test
	void addUserTest() {
		User user=new User();
		user.setId("헐렐레");
		user.setPassword("987456");
		user.setName("라랄라");
		user.setAge(1);

		userDao.save(user);
	}
	
	//@Test 
	void getAllUsersAndDeleteThem(){
		List<User> users= userDao.getAllUsers(); // 받아온 걸 users에 저장해서
		for (User user: users){
			userDao.delete(user); // 다 지움
		}
	}


}

일단 addUserTest()부터 실행해봅니다. 

 

SpringserverApplicationTest 파일을 우클릭 하여 run해봅니다.

오류 없습니다.

 

 

mysql로 가서 확인해봅니다.

들어갔습니다.

 

이제 삭제해보겠습니다.

오류 없습니다.

 

삭제됐네요. 굳!

 

 

 

4. @GetMapping, @PostMapping 처리

일단 값을 확인하기 위해 UserDao에 있는 함수 몇군데를 수정합니다.

package com.example.springserver.model.user;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Streamable;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class UserDao { // auto-writing / Data Access Object
    @Autowired
    private UserRepository repository;


    public User save(User user){
        return repository.save(user); // repository 함수가 다 자동으로 해줌
    }

    public List<User> getAllUsers(){
        List<User> users=new ArrayList<>();
        Streamable.of(repository.findAll()).
                forEach(users::add);

        return users;
    }

    public void delete(String id){
        repository.deleteById(id);
    }



}

save 함수가 실행될 때마다 실제로 잘 들어갔는지 확인하기 위해 반환값을 User로 설정하였습니다.

또한 id만 넘기면 그 user의 정보가 삭제되게 String id로 id를 받아서 deleteById 함수를 이용해 이용자를 삭제할 것입니다.

 

 

springserver package 아래에 model package랑 같은 위치에 controller package를 새로 생성합니다.

 

userController를 작성해줍니다.

package com.example.springserver.controller;

import com.example.springserver.model.user.User;
import com.example.springserver.model.user.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private UserDao userDao;

    @GetMapping("/user/get-all") // 나중에 android에서 요청할 때
    public List<User> getAllUsers(){
        return userDao.getAllUsers();
    }

    // android에서 새로운 정보를 입력받는다면
    @PostMapping("/user/save")
    public User save(@RequestBody User user){ // @RequestBody로 data 받아옴
        return userDao.save(user);
    }

}

일단 @GetMapping, @PostMapping을 다룹니다.

@GetMapping에서는 모든 user들의 정보를 갖고오는 함수를 작성합니다.

@PostMapping에서는 안드로이드 앱에서 만약 user 정보가 새롭게 들어온다면 @RequestBody로 받아온 다음 CrudRepository에 있는 함수를 이용하여 save 해줍니다.

 

서버 키고 시작해봅시다

 

우측 상단 8080

port가 8080이네요.

 

 

@GetMapping부터 보겠습니다. 

GET으로 설정하고 방금 UserController에서 설정한 /user/get-all 을 실행해봅니다.

제가 조아하는 데이식스 멤버를 넣었습니당.

잘 나오네요

get-all 확인

 

 

이제 @PostMapping 차례입니다.

값을 JSON 형태로 넣어줍니다.

정재현

입력되는 변수 순서는 상관없습니다.

send 누르면 어떻게 되나 봅시다.

 

 

와우. 아까 반환형을 User로 바꿨더니 post한 값을 확인할 수 있습니다.

 

 

mysql workbench로 가서 정말 들어갔는지 확인해보겠습니다.

제 이름과 친구 이름은 가렸습니다. 제대로 들어가있는 것을 확인했습니다.

 

 

id를 똑같이 입력한 상태에서 정보만 바꿔봅시다. 

정재현씨의 age를 2살 내려봅시다.

send 누른 결과 화면

잘 내려갔네요. mysql workbench도 볼까요?

 

 

나이 바꼈네여. 정말 다행입니다. 군대 가지마

 

 


다음 글 : https://kmyobin.tistory.com/77

 

Spring boot <-> Android 연동하기 (2) MySQL에 있는 모든 데이터를 가져와서 Android 앱에 출력하기

이전 글 : https://kmyobin.tistory.com/76 Android 연동하기 (1) 데이터 넣고 확인하기" data-og-description="이전 글 : https://kmyobin.tistory.com/75 MySQL 연동하기" data-og-description="spring boot 작..

kmyobin.tistory.com

 

댓글