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..
가끔, 이아니라 일하다보면 외국인이랑 일할 경우가 상당히 많다. 나 같은 경우는 한국인 보다 다른 외국인하고 일하는 경우가 더 많다. 그런데 나의 못된 성품의 탓인지 몰라도, 한국보다 후진국인 필리핀, 미얀마 등등의 동남아의 사람에게는 아무리 상사라도 막 질러버리는 습관이있다. 무의식적으로 나보다 아래라고 보는 거같다. 실제로는 나보다 훨씬 대단하고 인정 받고 있는 사람임에도 불구하고.. 이러한 경우 그러한 사람들에게 나의 부정적 이미지를 심어줄 수 있기 때문에 적어도 한국에서 하는 것 or 일본인에게 하는거 절반이라도 공손하게 대하자. 원래 한국과 같은 유교 사상이 없다고 치더라도 내가 막대하고 있는 것은 그 사람들도 본능적으로 알 거라고 생각하기 때문에 .. 결과적으로 그러한 사람들에게 막대해 봤자 ..
인터넷 상에 공개된 글을 쓴다는 것, 이러한 행위 자체가 나에게는 어느정도 의 생각의 정리를 하게 해준다. 언젠가 그러한 글을 본적이 있다. "내가 만약 글쓰기를 하지않았다면 나는 진즉에 미쳐버렸을 것이다." 지금 어느정도 굉장히 공감이 된다. 나이를 먹음에 따라 서로 자신의 생각이 강해지고 타인을 수용하려는 마음이 없어질때 그러함에도 나는 나의 사상, 생각을 밖으로 표현할 필요가 있다. 이러한 출구로써 불특정 다수에게 보여지는 이러한 글을 쓰는 것 자체가 굉장한 만족감을 준다는 것을 새삼스럽게 깨닫게 된다. 따라서 앞으로는 내가 하고 싶은 말, 내 상각을 가감없이 인터넷 상에 표현하려 한다. 누군가는 읽고 누군가는 읽지 않겠지만 이제 그러한 문제는 나에게 큰 의미가 없다. 세상을 향한 출구로써 이러한 ..
일을 하다보면 상대방을 내가 원하는 방향으로 바꾸려고 나의 주장을 너무나도 강하게 말해버릴 떄가 있다. 그것이 설령 상사라고 해도... 아무리 내가 외국에 있다고해도 나의 의견을 주입시키려 하는 것을 경계하자, 개발 경력이 짧은 나로써는 무조건 책임 회피하는 것이 좋다. 책임을 회피해야 살아남는다 특히 일본에선. 중요한 결정은 항상 매니저, 상사에게 허가를 받으면서 움직이도록 하자. 그리고 말할떄 생각좀 하면서 말하자 무조건 지르지말고, 결국 불투명한 점은 질문을 통해 해소하면 되는 부분이기 때문에 너무 스스로 결론을 내지 말도록 하자. 매우 위험한 행동임에 틀림 없다.. 머리가 어지러울땐 일단 모든걸 접고 혼자 생각정리 , 뭘해서라도 머리를 리셋 시키고 처음부터 다시 천천히 시작하는게 좋다.
92년생 나는 한국나이로 30살, 이제 어느정도 어른이 되었다고 부를 수도 있는? 나이가 되었다. 주변에서는 남들보다 조금 더 성공한 친구도 보이고 그렇지 못한 친구도 보이고.. 어느정도 갈리는 시기가 아닌가 싶다. 내가 일본생활을 시작하고 한국에서 친했던 친구들에게 전화를 할 때 마다 놀라는게 있다. 한국에서는 그렇게 친하게 지내고 오랜 시간 지냈던 친구 이지만 나이가 들고 사는 환경이 달라짐에 따라 서로의 마음이 점점 멀어지는 것을 실시간으로 느끼고 있다... 해외 생활을 해서 더욱 그렇게 느끼는 지몰라도 정말 사람의 인간관계에는 유통기한이 있나.. 라는 생각을 하게 되었다. 물론 나이먹고 친구에게 감정적인 교류를 바라는 것은 어른이 되지 못한자의 어리광같이 느껴지기도 하지만 .. 점점 친구라는 존재..
import java.util.Arrays; import java.util.List; import java.util.function.IntPredicate; public class TestClass { private static final List numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); public static int count(IntPredicate predicate) { int count = 0; for (int num : numList) { if (predicate.test(num)) { count++; } } return count; } public static void main(String[] args) { int evenNumCoun..
제너릭 클래스나 함수에서 사용하는 자료형을 외부에서 지정할 수 있는 기능을 말함 ex) Class A -> Class B(상속 받음) 이 두 클래스의 인스턴스를 공용으로 사용하는 하나의 함수에 패러미터로 받으러면? Class A(Super Class) A의 자료형으로 받으면 B를 넣어도 A로 캐스팅 됨, 따라서 두 클래스 모두 함수의 패러미터로 사용 가능함 fun castingExam(var a: A) But, 캐스팅 연산은 프로그램의 속도를 저하시킬 수 있다는 단점이 있다 -> 제너릭 등장 제너릭은 함수나 클래스를 선언 할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 패러미터를 받아 사용하는 방법입니다. 일반적으로 'Type'의 이니셜인 T를 사용 T -> U -> V 순으로 사용 fun m..
기존의 var , val의 차이는 알고 있다 ( 할당된 객체를 바꿀 수 있는 지의 유무) 그러나 val에서 객내 내부의 속성을 변경 할 수 없는 것은 아니다 그러나 상수는 절대 변경 할 수 없다 상수 절대 변경할 수 없는 값 const val CONST_A = 1234 String과 같은 기본 자료형으로만 가능 클래스 객체들을 담는 것은 불가능 클래스의 속성(field)이나 함수의 지역변수로는 사용 불가능 반드시 companion object 안에서 사용하여 객체의 생성과 관계 없이 고정적인 값으로만 사용 됨 이름은 의례적으로 대문자와 언더바만 사용 const val CONST_A = 1234 예제 fun main() { val foodCourt = FoodCourt() foodCourt.searchPr..
특별한 기능이나 형태의 클래스 Data Class 데이터를 다루는데 최적화된 class로 '5가지'기능을 내부적으로 자동으로 생성해준다 내용의 동일성을 판단하는 equals()의 자동 구현 객체의 내용에서 고유한 코드를 생성하는 hashcode()의 자동구현 포함된 속성을 보기쉽게 나타내는 toString()의 자동구현 객체를 복사하여 똑같은 내용의 새 객채를 만드는 copy()의 자동 구현 아무 패러미터가 없으면 똑같은 내용으로 생성 val a = Data("A",7) val b = a.copy() 패러미터가 있다면 해당 패러티머를 교체하여 생성 val a = Data("A",7) val b = a.copy("B") b ->Data("B",7) 로 생성 속성을 순서대로 반환하는 componenetX(..
문제 이해 정수 저장 arr 에서 가장 작은 수 제거한 배열 Return 빈 배열일 경우(1~0) -> -1 채워 Return 접근 size 체크 -> -1 반환 filter 사용해서 min 값 걸러내기 풀이 class Solution { fun solution(arr: IntArray): IntArray = if (arr.size == 1) intArrayOf(-1) else arr.filter { it != arr.min() }.toIntArray() }
문제 이해 양의 정수 n 이 임이의 수의 제곱인지 판단 제곱 -> x+1의 제곱 제곱X -> -1 접근 sqrt 사용, 형식 맞추기 제곱근 확인 후 Return 풀이 class Solution { fun solution(n: Long): Long { val a = sqrt(n.toDouble()).toLong() return if (a * a == n) (a + 1)*(a + 1) else -1 } } 다른사람의 풀이 class Solution { fun solution(n: Long): Long { val sqrt = sqrt(n.toDouble()) return if(sqrt % 1.0 == 0.0) { (sqrt + 1).pow(2.0).toLong() } else { -1L } } }
클래스 안에서 클래스가 중첩되는 두가지 유형 중첩 클래스(Nested Class) class Outer { class Nested { } } 하나의 클래스가 다른 클래스의 기능과 강하게 연관 되어 있다는 의미를 전달하기 위해 만들어진 형식으로 사용할 때는 Outer.Nested()와 같이 사용 외부 클래스의 내용을 공유 할 수 없음(별개) 내부 클래스(Inner class) class Outer { inner class Inner { } } 혼자서 객채를 만들 수는 없고 외부 클래스의 객체가 있어야지 생성과 사용이 가능한 클래스를 말함 외부 클래스의 속성과 함수의 사용이 가능 예제 fun main() { Outer.Nested().introduce() val outer = Outer() val inner..
nullable 변수에서 null을 처리하는 법 nullable 변수 var sample: String? = null But null상태로 속성이나 함수를 쓰려고 하면 -> null pointer exception 발생 (null 인 객체를 참조하면 발생하는 오류) var sample: String? = null if (sample != null) println(sample.toUpperCase()) 위와 같은 null Check 필요 ?. null safe operator sample?.toUpperCase() 참조연산자를 실행하기 전에 먼저 객체가 null 인지 확인부터 하고 객체가 null이라면 뒤의 구문을 실행하지 않는 연산자 이다. ?: elvis operator sample?:"default"..
Observer(옵저버) 패턴 이벤트가 발생하는 것을 '감시' 하는 감시자의 역할을 만든다고 해서 옵저버라고 부름 안드로이드의 예라면 키의 입력 터치의 발생 데이터 수신 함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해서 발생하게 되는 동작들을 이벤트라고 한다. 이러한 이벤트가 발생할 때마다 '즉각적으로 처리' 할 수 있도록 만드는 프로그래밍 패턴을 '옵저버 패턴' 이라고 함 Observer(옵저버) 패턴을 구현하기 위해서는 두개의 클래스가 필요함 이벤트를 수신 이벤트의 발생 및 전달 두 클래스간의 통신하는 방법 : 인터페이스 'observer' 이용 코틀린에서는 listener 라고 함 -> 이렇게 이벤트를 넘겨주는 행위를 CallBack 이라고함 //class EventPrinter : 이벤트를..