DB 테이블을 생성한다.
CREATE DATABASE springtodo
ENCODING = 'UTF8'
LC_COLLATE = 'C'
LC_CTYPE = 'C'
CONNECTION LIMIT = -1;
CREATE TABLE todo (
id serial ,
title varchar(20)
)
INSERT INTO todo (title) VALUES ('물 마시기');
INSERT INTO todo (title) VALUES ('책읽기');
INSERT INTO todo (title) VALUES ('운동하기');
build.gradle 파일에 아래 설정을 확인한다.
dependencies {
...
runtimeOnly 'org.postgresql:postgresql'
...
}
resources/application.properties 파일에 아래 코드를 추가하여 설정을 완료한다.
#### postgresql
spring.datasource.hikari.maximum-pool-size=4
spring.datasource.url=jdbc:postgresql://localhost:5432/springtodo #database명
spring.datasource.username=유저이름
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=org.postgresql.Driver
resources/static 폴더 아래에 index.html 파일을 생성한다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello world ~!</title>
</head>
<body>
<div>
SpringBoot TODO!
</div>
</body>
</html>
build.gradle 파일에 아래 설정을 확인한다.
dependencies {
...
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2'
...
}
resources/application.properties 파일에 아래 코드를 추가한다.
# mybatis
# mybatis.config=mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=hello.springmvc.springtodo.DTO
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.lazy-loading-enabled=false
객체를 구성하기 위한 파일이다.
hello.springmvc.springtodo.DTO.TodoDTO.java
import lombok.*;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TodoDTO {
private Integer id;
private String title;
}
mapper은 xml 파일과 1:1 매핑되는 파일이다.
hello.springmvc.springtodo.Mapper.TodoMapper.java
import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.Mapper;
@Repository
@Mapper
public interface TodoMapper {
List<TodoDTO> selectTodoList();
TodoDTO selectTodoById(Integer id);
}
쿼리문을 작성하는 xml 파일이다.
resources.mybatis.mapper.TodoMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="hello.springmvc.springtodo.Mapper.TodoMapper">
<select id="selectTodoList" resultType="TodoDTO">
SELECT id, title
FROM public.todo
</select>
<select id="selectTodoById" resultType="TodoDTO">
SELECT id, title
FROM public.todo
WHERE id = #{id}
</select>
</mapper>
Controller란 URL 매핑을 통해 사용자의 요청을 처리하고 응답 데이터를 응답하는 역할을 한다.
Controller에서는 Service를 주입받아 Service의 함수를 호출하는 정도만 한다.
hello.springmvc.springtodo.Controller.TodoController.java
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@RequestMapping("/todo")
public class TodoController {
private final TodoService todoService;
@GetMapping()
public List<TodoDTO> selectTodoList(){
return todoService.selectTodoList();
}
@GetMapping("/{id}")
public TodoDTO selectTodoById(@PathVariable("id") int id){
return todoService.selectTodoById(id);
}
Service는 Controller 대신 구체적이고 복잡한 로직들을 처리하는 단계이다.
확장성을 위해 Service interface를 따로 생성한다.
hello.springmvc.springtodo.Service.TodoService.java
public interface TodoService {
public List<TodoDTO> selectTodoList();
public TodoDTO selectTodoById(Integer id);
}
인터페이스의 구현체를 생성한다.
hello.springmvc.springtodo.Service.TodoServiceImpl.java
@Service
@RequiredArgsConstructor
public class TodoServiceImpl implements TodoService {
private final TodoMapper todoMapper;
@Override
public List<TodoDTO> selectTodoList() {
return todoMapper.selectTodoList();
}
@Override
public TodoDTO selectTodoById(Integer id) {
return todoMapper.selectTodoById(id);
}
}