Intellij에서 데이터베이스에 바로 접근하기 위해서는 유료 버전을 구매하거나 Database Navigator 플러그인을 설치하면 된다.
스프링에 데이터베이스를 연결하기 위해서 우선 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은 데이터베이스에 접근할 때 사용할 프로그램이다.
Database Navigator 플러그인을 설치하면 좌측에 DB Brower라는 아이콘이 생성된다. 이 아이콘을 클릭한 후 '+' 버튼을 클릭하면 connection이 생성되는데 username과 password는 위와 동일하게 입력하고 나머지는 따로 건들지말고 확인을 누르면 console이 생성된다.
이 console을 사용하여 데이터베이스 접근이 가능하다.
console이 작동되는 것을 확인하였으면 가장 먼저 유저 테이블을 생성해야 한다.
기존에 List 형식으로 user 객체를 생성하여 이 정보를 userResponse에 저장했던 것을 기억할 것이다.
하지만, 이렇게 유저 정보를 저장하면 메모리에만 저장이 되어 서버를 재시작하면 유저 정보가 사라지는 문제점이 발생하였다.(그래서 데이터베이스를 사용한다)
이제, 데이터베이스에 유저 테이블을 생성하여 정보를 저장할 수 있게 하자.
유저 테이블이 정상적으로 생성되었다.
잠시 다른 이야기지만 Intellij에서 console에 SQL을 실행할 때 문구를 드래그에서 ctrl + enter를 하면 실행된다.
유저 테이블도 만들었으니 기존에 만들었던 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값이 대체되어 데이터가 저장된다(데이터베이스에)
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;
}