Swagger 도입 Api Test, 설명UI 깔끔 build.gradle에 추가 implementation("io.springfox:springfox-swagger2:2.9.2") implementation("io.springfox:springfox-swagger-ui:2.9.2") SwaggerConfig @Configuration @EnableSwagger2 class SwaggerConfig { @Bean fun docket(): Docket { return Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build() } } 위와 같이 설명, U..
데이터 베이스 스키마 설계 Todo //Column data class Todo( var index: Int? = null, // 일정 index var title: String? = null, // 일정 title var description: String? = null, // 일정 설명 var schedule: LocalDateTime? = null, // 일정 시간 var createdAt: LocalDateTime? = null, // 생성 시간 var updatedAt: LocalDateTime? = null, // 업데이트 시간 ) fun Todo.convertTodo(todoDto: TodoDto): Todo { return Todo().apply { this.index = todoDto.i..
TodoApiController 투두 앱의 CRUD 처리를 담당하는 컨트롤러 작성(설계 단계) Reqeust 에는 필요한 Bodyt 설계 -> Valid 작업들어가기 때문에 핸들러도 작성해준다. @RestController @RequestMapping("/api/todo") class TodoApiController { // R @GetMapping(path = [""]) fun read(@RequestParam(required = false) index: Int?) { // 없으면 전체조회, 있으면 단건 조회, required -> 필수값 아닌지 정하기, Optional이므로 Valid할 필요 없다. } // C @PostMapping(path = [""]) fun create(@Valid @Reque..
본 프로젝트는 테스트 주도 개발(Test-driven development, TDD)로 만들어짐 Repository 작성과 함께 테스트도 함께 작성함 실제 데이터베이스는 사용X(JPA), 메모리DB사용 Config AppConfig // 스프링 부트 실행시, 해당 값들을 먼저 참조 -> Config Class @Configuration class AppConfig { /* val database = TodoDataBase()와 같은 형태로 static 걸어서 쓰지만 Spring의 패러다임은 자동으로 주입되게 만드는 것임.*/ @Bean(initMethod = "init") // Bean으로 등록, init지정, 빈이 만들어질때 어떤 메소드 참조할지 정한다 fun todoDataBase(): TodoDat..
Exception Annotation @RestController @RequestMapping("/api/exception") @Validated class ExceptionApiController { // 연습용 Api, 실무는 X @GetMapping("/hello") fun hello(): String { val list = mutableListOf() //val temp = list[0] return "hello" } @GetMapping("") fun get( @NotBlank @Size(min = 2, max = 6) @RequestParam name: String, @Min(10) @RequestParam age: Int ): String { //통과된 경우만 -> print(Validate..
Exception Annotation @ControllerAdvice : Global 예외 처리 및 특정 pakage / Controller 예외 처리 @ExceptionHandler : 특정 Controller의 예외 처리 GlobalControllerAdvice //@RestControllerAdvice(basePackageClasses = [ExceptionApiController::class]) -> Target 설정 가능 //@RestControllerAdvice // RestController의 Exception이 이 컨트롤러를 통하게 됨(Global : 괄호X) class GlobalControllerAdvice { // 특정 예외를 잡겠다고 지정 @ExceptionHandler(value ..
@Transient 때때로 실제 테이블에 넣고 싶지않은 컬럼이 맵핑되어 버리거나, 필요없는 컬럼을 엔티티 맵핑에서 제외 하고 싶을때 사용하는 어노테이션 엔티티 클래스의 변수들은 대부분 테이블 컬럼과 매핑된다. 그러나 몇몇 변수는 매핑되는 칼럼이 없거나 매핑에서 제외해야만 하는 경우도 있다. @Transient는 엔티티 클래스 내의 특정 변수를 영속 필드에서 제외할 때 사용한다.
Validation 필요한 이유 유효성 검증 하는 코드의 길이가 너무 길다. -> annotation 으로 해결 service logic에 대해서 방해가 된다. 흩어져 있는 경우 어디서 검증 되었는지 찾기 힘들다. 검증 로직이 변경되는 경우 테스트 코드 등, 전체 로직이 흔들릴 수 있다. -> 한 곳에 몰아서 검증 가능 JSR-380 BeanValidation build.gradle.kts 세팅 DeleteApiController // https://beanvalidation.org/2.0-jsr380/spec/ // JSR-320 // hibernate Validation // Spring boot Validation @RestController @RequestMapping("/api") @Valida..
문제 이해 실패율 : 스테이지에 도달, but 클리어 하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수 스테이지에 도달한 유저가 없을 경우 실패율 0 N = 전체 스테이지의 갯수 stage = 사용자가 멈춰있는 스테이지의 번호가 담긴 배열 Return -> 실패율이 높은 스테이지부터 내림차순 배열 접근 2개의 Map 작성 스테이지, 사람수 스테이지, 실패율 내림차순 정리 answer 도출 풀이 class Solution { fun solution(N: Int, stages: IntArray): IntArray { var answer = IntArray(N) val indexMap: MutableMap = mutableMapOf() // 스테이지, 사람수 val failureMap: Mutable..
문제 이해 정수 n, m 가로 n, 세로 m 직사각형 출력 접근 이 중 포문으로 찍기 풀이 fun main(args: Array) { val (a, b) = readLine()!!.split(' ').map(String::toInt) for (i in 0 until b) { for (j in 0 until a) { print("*") } println() } }
ResponseApiController data class UserRequest( var name: String? = null, var age: Int? = null, var email: String? = null, var address: String? = null, var phoneNumber: String? = null ) @RestController @RequestMapping("/api/response") class ResponseApiController { // 1. get 4XX -> Error // GET http://localhost:8080/api/response?age=10 @GetMapping("") fun getMapping(@RequestParam age: Int?): Respon..
절차 지향적 프로그래밍, 객체 지향형 프로그래밍, 함수형 프로그래밍 등 다양한 프로그래밍 기법중 하나이다. 기존의 명령형 프로그램 방식(Pull) 컴퓨터 하드웨어를 대상으로 프로그래머가 작성한 코드가 정해진 절차에 따라 순서대로 실행 리액티브 프로그래밍(Push) 데이터의 흐름을 미리 정의, 데이터의 값이 변경되었을 때, 관련 함수나 수식 업데이트 됨 즉, 프로그래머가 기존의 명령형 프로그래밍 방식과 같이 어떤 기능을 직접적으로 실행하는 것이 아닌 프로그램 속 시스템에 특정 이벤트 발생하면, 이를 효율적으로 처리하는 것이라고 할 수 있다. 이를 옵저버 패턴이라고 한다. 다시말해, 리액티브 프로그래밍은 데이터 흐름과 변화의 전달에 관한 프로그래밍 패러다임이다. 리액티브 프로그래밍은 주변환경과 끊임없이 상호..