/* Spring JDBC */
Spring JDBC를 이용해 Java 언어로 데이터베이스와 연동해 쿼리를 실행시킬 수 있다.
일단 테이블을 만들어야 하므로 resource 폴더에 schema.sql 이라는 파일을 만들고 다음과 같이 쿼리를 작성했다.
CREATE TABLE course (
id bigint not null,
name varchar(255) not null,
author varchar(255) not null,
primary key(id)
);
SPRING JDBC 의존성을 추가했으므로 스프링부트 실행 시에 이 쿼리도 실행이 될것이다.
그리고 Course라는 객체를 다음과 같이 만들자
@Getter
@Setter
public class Course {
private Long id;
private String name;
private String author;
public Course() {
}
public Course(Long id, String name, String author) {
this.id = id;
this.name = name;
this.author = author;
}
@Override
public String toString() {
return "Course{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
'}';
}
}
** 주의할점은 Course 객체의 각 필드의 이름들이 schema.sql의 각 key들의 이름들과 같아야 한다.
그럼 이들을 실행시킬 쿼리들을 자바 파일에서 만들어 보자
@Repository
public class CourseJdbcRepository {
@Autowired
public CourseJdbcRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
private JdbcTemplate jdbcTemplate;
private static String INSERT_QUERY =
"""
insert into course values (?,?,?);
""";
private static String DELETE_QUERY =
"""
delete from course where id = ?;
""";
private static String SELECT_QUERY =
"""
SELECT * FROM course WHERE id = ? ;
""";
public void insert(Course course){
jdbcTemplate.update(INSERT_QUERY,course.getId(),course.getName(),course.getAuthor());
}
public void delete(Long id){
jdbcTemplate.update(DELETE_QUERY,id);
}
public Course findById(Long id){
//ResultSet -> Bean =? Row Mapper
return jdbcTemplate.queryForObject(SELECT_QUERY, new BeanPropertyRowMapper<>(Course.class), id);
}
}
생성자 안에 JdbcTemplate이라는 객체를 import 받았는데 이는 jdbc 의존성 안에 포함되어 있는 객체이다.
INSERT_QUERY, DELETE_QUERY, SELECT_QUERY 를 보면 ' ? ' 가 있다. 그 아래에 있는 메서드의 update메서드는 Insert, Delete, Update 쿼리를 실행하는데 이 메서드의 패러미터가 ' ? ' 에 자동으로 매핑을 한다.
findById메서드를 보면은 update가 아닌 queryForObject 메서드가 실행이 되었다. 이는 SELECT 문을 실행시키기 위한 메서드 이며 return 값으로는 객체가 되겠다. queryForObject의 두번째 패러미터는 BeanPropertyRowMapper를 사용했는데 이는 리턴값을 의미한다.
** 리턴 값을 제대로 받으려면 Course 객체에 Setter를 생성해야 한다.
그 다음으로는 이러한 메서드들을 실행시킬 클래스를 만들어야 한다.
@Component
public class CourseJdbcCommandLineRunner implements CommandLineRunner {
private CourseJdbcRepository courseJdbcRepository;
@Autowired
public CourseJdbcCommandLineRunner(CourseJdbcRepository courseJdbcRepository) {
this.courseJdbcRepository = courseJdbcRepository;
}
//execute at the startup
@Override
public void run(String... args) throws Exception {
courseJdbcRepository.insert(new Course(1L,"Learn AWS","SpringBoot"));
courseJdbcRepository.insert(new Course(2L,"Learn Azure","SpringBoot"));
courseJdbcRepository.delete(1L);
System.out.println(courseJdbcRepository.findById(2L));
}
}
위 자바 소스를 보면은 CommandLineRunner를 implements 했는데 이 인터페이스를 implements 하면 스프링부트 서버 실행시 override 된 run 함수를 자동으로 실행시켜준다.
그러면 스프링부트를 실행하고 H2-Console을 들어가보자
run 메서드가 잘 실행된 것을 확인할 수 있다.
콘솔 창 밑에 Course 객체가 잘 조회된 것을 확인할 수 있다.
'백엔드' 카테고리의 다른 글
[Spring Boot] 메시지 국제화 (Internationalization) (0) | 2024.01.02 |
---|---|
[Spring Boot] @Validation 유효성 (0) | 2023.12.17 |
[Spring Boot] @ConfigurationProperties (0) | 2023.12.16 |
[Spring Boot] 컴포넌트와 빈 차이 (Component vs Bean) (1) | 2023.12.01 |
[Spring Boot] 스프링 빈 (Spring Bean) & 스프링 컨테이너 (Spring Container) (0) | 2023.12.01 |