implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.4.5'
implementation group: 'com.google.guava', name: 'guava', version: '30.1.1-jre'
compileOnly 'org.projectlombok:lombok:1.18.20'
+ implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6'
+ developmentOnly 'org.springframework.boot:spring-boot-devtools' // hotdeploy
}
test {
-package com.example.data;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-@NoArgsConstructor
-@Builder
-@AllArgsConstructor
-public class TodoHeaderInfo {
- @Getter
- @Setter
- private Integer id;
- @Getter
- @Setter
- private String name;
-}
+package com.example.domain;\r
+\r
+import lombok.AllArgsConstructor;\r
+import lombok.Builder;\r
+import lombok.Getter;\r
+import lombok.NoArgsConstructor;\r
+import lombok.Setter;\r
+\r
+@NoArgsConstructor\r
+@Builder\r
+@AllArgsConstructor\r
+public class TodoHeaderInfo {\r
+ @Getter\r
+ @Setter\r
+ private Integer id;\r
+ @Getter\r
+ @Setter\r
+ private String name;\r
+}\r
--- /dev/null
+package com.example.domain;
+
+import java.sql.Timestamp;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@NoArgsConstructor
+@Builder
+@AllArgsConstructor
+public class TodoListInfo {
+ @Getter
+ @Setter
+ private Integer id;
+ @Getter
+ @Setter
+ private Integer headerId;
+ @Getter
+ @Setter
+ private String name;
+ @Getter
+ @Setter
+ private Boolean done;
+ @Getter
+ @Setter
+ private Timestamp created;
+ @Getter
+ @Setter
+ private Timestamp updated;
+}
\ No newline at end of file
--- /dev/null
+package com.example.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@NoArgsConstructor
+@Builder
+@AllArgsConstructor
+public class TodoHeaderDto {
+ @Getter
+ @Setter
+ private Integer id;
+ @Getter
+ @Setter
+ private String name;
+}
--- /dev/null
+package com.example.dto;
+
+import java.sql.Timestamp;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@NoArgsConstructor
+@Builder
+@AllArgsConstructor
+public class TodoListDto {
+ @Getter
+ @Setter
+ private Integer id;
+ @Getter
+ @Setter
+ private Integer headerId;
+ @Getter
+ @Setter
+ private String name;
+ @Getter
+ @Setter
+ private Boolean done;
+ @Getter
+ @Setter
+ private Timestamp created;
+ @Getter
+ @Setter
+ private Timestamp updated;
+}
\ No newline at end of file
--- /dev/null
+package com.example.logic;\r
+\r
+import java.util.List;\r
+import java.util.stream.Collectors;\r
+\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Component;\r
+import org.springframework.util.ObjectUtils;\r
+\r
+import com.example.domain.TodoHeaderInfo;\r
+import com.example.domain.TodoListInfo;\r
+import com.example.dto.TodoHeaderDto;\r
+import com.example.dto.TodoListDto;\r
+import com.example.mapper.TodoHeaderMapper;\r
+import com.example.mapper.TodoListMapper;\r
+\r
+@Component\r
+public class TodoLogic {\r
+ @Autowired\r
+ private TodoHeaderMapper todoHeaderMapper;\r
+ @Autowired\r
+ private TodoListMapper todoListMapper;\r
+\r
+ public List<TodoHeaderInfo> findTodoHeaders() {\r
+ return toTodoHeaderInfo(todoHeaderMapper.findTodoHeaders());\r
+ }\r
+ \r
+ private List<TodoHeaderInfo> toTodoHeaderInfo(List<TodoHeaderDto> list) {\r
+ return list.stream().map(this::toTodoHeaderInfo).collect(Collectors.toList());\r
+ }\r
+ \r
+ private TodoHeaderInfo toTodoHeaderInfo(TodoHeaderDto dto) {\r
+ return TodoHeaderInfo.builder()\r
+ .id(dto.getId())\r
+ .name(dto.getName()).build();\r
+ }\r
+ \r
+ public List<TodoListInfo> findTodoLists(String headerId) {\r
+ if(ObjectUtils.isEmpty(headerId)) {\r
+ throw new RuntimeException("headerId is Empty!");\r
+ }\r
+ return toTodoListInfo(todoListMapper.findTodoLists(Integer.valueOf(headerId)));\r
+ }\r
+ \r
+ private List<TodoListInfo> toTodoListInfo(List<TodoListDto> list) {\r
+ return list.stream().map(this::toTodoListInfo).collect(Collectors.toList());\r
+ }\r
+ \r
+ private TodoListInfo toTodoListInfo(TodoListDto dto) {\r
+ return TodoListInfo.builder()\r
+ .id(dto.getId())\r
+ .headerId(dto.getHeaderId())\r
+ .done(dto.getDone())\r
+ .created(dto.getCreated())\r
+ .updated(dto.getUpdated())\r
+ .name(dto.getName())\r
+ .build();\r
+ }\r
+}\r
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
-import com.example.data.TodoHeaderInfo;
+import com.example.dto.TodoHeaderDto;
@Mapper
public interface TodoHeaderMapper {
-
@Select({ "<script>",
" select",
- " id",
- " , name",
+ " id",
+ " , name",
" from",
- " todo_header ",
+ " todo_header ",
+ " order by ",
+ " id",
"</script>" })
- List<TodoHeaderInfo> findTodoHeaders();
+ List<TodoHeaderDto> findTodoHeaders();
}
--- /dev/null
+package com.example.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import com.example.dto.TodoListDto;
+
+@Mapper
+public interface TodoListMapper {
+ @Select({ "<script>",
+ " select",
+ " header_id",
+ " , id",
+ " , name",
+ " , done",
+ " , created",
+ " , updated",
+ " from",
+ " todo_list ",
+ " where",
+ " header_id = #{headerId}",
+ " order by ",
+ " id",
+ "</script>" })
+ List<TodoListDto> findTodoLists(@Param("headerId") Integer headerId);
+}
\ No newline at end of file
--- /dev/null
+package com.example.rest;\r
+\r
+import org.springframework.http.HttpHeaders;\r
+import org.springframework.http.HttpStatus;\r
+import org.springframework.http.MediaType;\r
+import org.springframework.http.ResponseEntity;\r
+import org.springframework.web.bind.annotation.ControllerAdvice;\r
+import org.springframework.web.bind.annotation.ExceptionHandler;\r
+\r
+import com.google.gson.Gson;\r
+\r
+@ControllerAdvice\r
+public class ErrorAdvisor {\r
+\r
+ @ExceptionHandler(Throwable.class)\r
+ public ResponseEntity<String> exceptionHandler(Exception e) {\r
+ ApiResponse apiResponse = new ApiResponse();\r
+ apiResponse.setErrorMessage(e.getMessage());\r
+ apiResponse.setStatusNg();\r
+ HttpHeaders headers = new HttpHeaders();\r
+ headers.setContentType(MediaType.APPLICATION_JSON);\r
+ String responseJson = new Gson().toJson(apiResponse);\r
+ return new ResponseEntity<String>(responseJson, headers, HttpStatus.valueOf(500));\r
+ }\r
+ \r
+ public static class ApiResponse{\r
+ public enum ApiStatus {\r
+ OK, NG\r
+ }\r
+ private String status = ApiStatus.OK.toString();\r
+ private String errorMessage;\r
+ public int version = 1;\r
+\r
+ public String getStatus() {\r
+ return status;\r
+ }\r
+ public void setStatusOk(){\r
+ status = ApiStatus.OK.toString();\r
+ }\r
+ public void setStatusNg(){\r
+ status = ApiStatus.NG.toString();\r
+ }\r
+ public String getErrorMessage() {\r
+ return errorMessage;\r
+ }\r
+ public void setErrorMessage(String errorMessage) {\r
+ this.errorMessage = errorMessage;\r
+ }\r
+ }\r
+}\r
import org.springframework.web.bind.annotation.ResponseBody;\r
import org.springframework.web.bind.annotation.RestController;\r
\r
-import com.example.data.TodoHeaderInfo;\r
-import com.example.service.TodoHeaderService;\r
+import com.example.service.TodoService;\r
import com.google.common.collect.Lists;\r
\r
\r
public class SampleRestController {\r
\r
@Autowired\r
- TodoHeaderService todoHeaderService;\r
+ TodoService todoHeaderService;\r
\r
@RequestMapping(value = "/test")\r
@ResponseBody\r
list.add("array2");\r
return list;\r
}\r
- \r
- @RequestMapping(value = "/dbTest")\r
- @ResponseBody\r
- public List<TodoHeaderInfo> dbTest() {\r
- return todoHeaderService.findTodoHeaders();\r
- }\r
}\r
--- /dev/null
+package com.example.rest;\r
+\r
+import java.util.List;\r
+\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.http.MediaType;\r
+import org.springframework.web.bind.annotation.RequestMapping;\r
+import org.springframework.web.bind.annotation.RequestMethod;\r
+import org.springframework.web.bind.annotation.RequestParam;\r
+import org.springframework.web.bind.annotation.ResponseBody;\r
+import org.springframework.web.bind.annotation.RestController;\r
+\r
+import com.example.domain.TodoHeaderInfo;\r
+import com.example.domain.TodoListInfo;\r
+import com.example.service.TodoService;\r
+\r
+\r
+@RestController\r
+public class TodoRestController {\r
+ \r
+ @Autowired\r
+ TodoService todoHeaderService;\r
+ \r
+ @RequestMapping(value = "/findHeaders")\r
+ @ResponseBody\r
+ public List<TodoHeaderInfo> findHeaders() {\r
+ return todoHeaderService.findTodoHeaders();\r
+ }\r
+ \r
+ @RequestMapping(value = "/findLists", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE , produces = MediaType.APPLICATION_JSON_VALUE)\r
+ @ResponseBody\r
+ public List<TodoListInfo> findLists(@RequestParam(name = "headerId") String headerId) {\r
+ return todoHeaderService.findTodoLists(headerId);\r
+ }\r
+ \r
+ @RequestMapping(value = "/getLists", method = RequestMethod.GET)\r
+ @ResponseBody\r
+ public List<TodoListInfo> getLists(@RequestParam(name = "headerId") String headerId) {\r
+ return todoHeaderService.findTodoLists(headerId);\r
+ }\r
+}\r
+++ /dev/null
-package com.example.service;
-
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.example.data.TodoHeaderInfo;
-import com.example.mapper.TodoHeaderMapper;
-
-@Service
-public class TodoHeaderService {
- @Autowired
- private TodoHeaderMapper todoHeaderMapper;
-
- public List<TodoHeaderInfo> findTodoHeaders() {
- return todoHeaderMapper.findTodoHeaders();
- }
-}
--- /dev/null
+package com.example.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.example.domain.TodoHeaderInfo;
+import com.example.domain.TodoListInfo;
+import com.example.logic.TodoLogic;
+
+@Service
+public class TodoService {
+ @Autowired
+ private TodoLogic todoHeaderLogic;
+
+ public List<TodoHeaderInfo> findTodoHeaders() {
+ return todoHeaderLogic.findTodoHeaders();
+ }
+
+ public List<TodoListInfo> findTodoLists(String headerId) {
+ return todoHeaderLogic.findTodoLists(headerId);
+ }
+}
server.port=19080
server.servlet.context-path=/todo
+spring.devtools.remote.restart.enabled=true
+spring.devtools.livereload.enabled=true
+
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres