Spring에서 데이터베이스 사용

goose_bumps·2024년 5월 29일

Intellij에서 데이터베이스에 바로 접근하기 위해서는 유료 버전을 구매하거나 Database Navigator 플러그인을 설치하면 된다.

1. application.yml

스프링에 데이터베이스를 연결하기 위해서 우선 application.yml 파일을 생성해야 한다.
main -> resources -> File을 생성하여 파일명을 application.yml로 입력한다.
yml 파일이 생성되면 다음과 같이 내용을 입력한다.

url에 입력한 주소는 스프링이 연결할 데이터의 주소를 가리킨다. jdbc는 Java DataBase Collector, mysql://localhost는 접근하려는 MySQL이 우리 컴퓨터에 있다는 뜻이다. 마지막에 있는 library는 접근하려는 데이터베이스를 말한다.

username과 password는 처음 MySQL에 접근했을때 입력한 계정명과 암호이다. 여기서는 'root'와 '1234'로 하겠다.

driver-class-name은 데이터베이스에 접근할 때 사용할 프로그램이다.

2. DB Brower 사용

Database Navigator 플러그인을 설치하면 좌측에 DB Brower라는 아이콘이 생성된다. 이 아이콘을 클릭한 후 '+' 버튼을 클릭하면 connection이 생성되는데 username과 password는 위와 동일하게 입력하고 나머지는 따로 건들지말고 확인을 누르면 console이 생성된다.
이 console을 사용하여 데이터베이스 접근이 가능하다.

3. 유저테이블 생성

console이 작동되는 것을 확인하였으면 가장 먼저 유저 테이블을 생성해야 한다.
기존에 List 형식으로 user 객체를 생성하여 이 정보를 userResponse에 저장했던 것을 기억할 것이다.
하지만, 이렇게 유저 정보를 저장하면 메모리에만 저장이 되어 서버를 재시작하면 유저 정보가 사라지는 문제점이 발생하였다.(그래서 데이터베이스를 사용한다)
이제, 데이터베이스에 유저 테이블을 생성하여 정보를 저장할 수 있게 하자.


유저 테이블이 정상적으로 생성되었다.

잠시 다른 이야기지만 Intellij에서 console에 SQL을 실행할 때 문구를 드래그에서 ctrl + enter를 하면 실행된다.

4. Post API 변경

유저 테이블도 만들었으니 기존에 만들었던 API를 수정해보자.
가장 먼저, Post 방식의 API를 수정하겠다.
UserController class에 들어가 메서드를 수정해야 한다. 클래스를 일일히 찾기 보다는 ctrl + shift + n 단축키를 사용하면 빠르게 찾을 수 있다.

객체에 저장하는 방식에서 데이터베이스에 저장하는 방식으로 변경해야 한다.
user 객체를 없애고 JdbcTemplate 객체를 추가한다. 그리고 이 객체를 초기화하는 UserController 생성자도 추가한다.

    private final JdbcTemplate jdbcTemplate;
    public UserController(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

이제 saveuser 메서드를 바꿔보자. 먼저 sql 문구를 받을 수 있는 String 변수를 생성하고 데이터를 저장하는 명령어를 대입한다.

String sql = "insert into user(name,age) value(?,?)";

대입한 문구는 이전에 정리한 데이터를 저장하는 SQL 명령어다. 필드에 저장해야 하는 value값을 ?로 한 이유는 저장되는 값이 고정적이지 않고 매번 변경되기 때문에 값을 유동적으로 넣기 위해서이다.

jdbcTemplate.update(sql,request.getName(),request.getAge());

? 값에 각각 request.getName()과 request.getAge() 값이 들어가게 된다. jdbcTemplate.update는 insert,update,delete쿼리에 사용될 수 있고 여기서는 insert 쿼리로 사용되었다. 첫 파라미터를 sql로 받고 이후에는 ?를 대신할 값을 대입하면 된다.

정리해보자면

  • request 객체가 받은 유저 정보를 getter을 통해 가져온다(name,age)
  • update를 통해 ?에 유저 정보(name,age)가 대입된다
  • sql 명령어 value값이 대체되어 데이터가 저장된다(데이터베이스에)

5. Get API 변경

getUser 메서드를 변경하였다. post api와 동일하게 String 변수 sql을 선언하여 user 데이터 전체를 조회하는 SQL 명령어를 대입하였다.
jdbcTemplate.query를 사용하면 select 쿼리를 날릴 수 있다.(이게 무슨 의미인지는 자세히 모르겠으나 계속 공부하면서 알게 되면 이 글을 수정하겠다.)
.query의 인자로 RowMapper 이너 클래스를 대입하여 내부에는 mapRow 메서드를 오버라이딩 하였다.
ResultSet 객체에는 결과가 담겨있고 getter를 사용하여 실제 값을 가져올 수 있다.

마지막에는 UserResponse 생성자를 return 하는데 여기서 한 가지 더 수정해야 할 것이 있다.
UserResponse 클래스에는 생성자로

public UserResponse(id, User user){
	this.id = id;
    this.name = user.getName();
    this.age = user.getAge();
    }

이렇게 name과 age는 user 객체를 인자로 받아 getter로 값을 받는 형식인데 id,name,age 모두 매개변수로 사용하는 생성자로 변경해야 한다.

    public UserResponse(long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

0개의 댓글