전체 글 39

[1주차] 88. Merge Sorted Array

https://leetcode.com/problems/merge-sorted-array/ 처음에는 단순히 sort 라이브러리를 이용하여 O(nlogn) 시간에 풀었다. for (i in nums2.indices) { nums1[m + i] = nums2[i] } nums1.sort() m, n = 0 && p2 >= 0) { if (nums1[p1] > nums2[p2]) { nums1[p3--] = nums1[p1--] } else { nums1[p3--] = nums2[p2--] } } if (p1 >= 0) { while (p1 >= 0) nums1[p3--] = nums1[p1--] } if (p2 >= 0) { while (p2 >= 0) nums1[p3--] = nums2[p2--] } p1이..

[Kotlin] Kotest 정리

미루고 미루던 테스트코드 작성 막상 시작하려니 막막해서 정리를 해 보려고 한다. Intellij에서 테스트 클래스 생성은 아래와 같이 생성한다. class AccountControllerTest : ShouldSpec({ should("verify") { } should("test") { } }) 생성되면 이런 모습이다. 물론 수동으로 생성해도 된다. 테스트 코드 작성에 다른 클래스가 필요한 것은 아니며, 독립적으로 실행 가능하다. [Test styles] Kotest 에는 10가지의 테스트 작성 스타일이 존재하며 이는 코드 작성 스타일을 지정하는 것 뿐 기능상의 차이점은 없다. 사용하고 싶은 스타일을 테스트 클래스에서 상속받고, 부모 클래스의 생성자로 작성한 테스트코드를 넘겨주면 된다. https://..

개발/Kotlin 2023.03.19

[SpringBoot] 발급받은 타행 SSL인증서를 SpringBoot에 적용시키기

*.crt.pem: Base64 형태로 인코딩된 서버인증서 -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- *.key.pem: Base64 형태로 인코딩된 개인키 -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- openssl 에서 해당 파일들을 이용해 keystore 추출 가능 openssl [keystore의 파일 타입] -export -in [*.crt.pem 파일 경로] -inkey [*.key.pem 파일 경로] -out [생성될 파일 이름] ex) openssl pkcs12 -export -in myweb.com.crt.pem -inkey myweb.com.key.pem ..

개발/Spring Boot 2022.12.10

[Kotlin] List 정렬방법 정리

원시 타입의 정렬 val list = arrayListOf(3, 1, 2) list.sort() println(list.joinToString(" ")) list.sortByDescending { it } println(list.joinToString(" ")) val list2 = arrayListOf("ccc", "aab", "aaa") list2.sort() println(list2.joinToString(" ")) list2.sortByDescending { it } println(list2.joinToString(" ")) 1 2 3 3 2 1 aaa aab ccc ccc aab aaa 사용자 정의 객체의 정렬 fun main() { val list = arrayListOf( Student("L..

[Kotlin] Immutable Collections, Mutable Collections

Immutable Collections 컬렉션 요소의 추가 및 수정이 불가능하다. (읽기전용) 때문에 Thread 작업 환경에서 안전하며, Mutable에 비해 메모리 효율적이다. 수정이 불필요한 컬렉션의 경우에는 Immutable로 선언하는것이 좋다. (외부 API로 부터 받아온 정보 등) Mutable Collections 기존 Java 컬렉션과 같이 요소 추가, 수정이 가능하다. Kotlin에서 listOf, SetOf 등의 메서드를 사용하여 생성되는 컬렉션은 Immutable하다. fun main() { val list = listOf() } val immutableList = listOf(3, 1, 2) val mutableList = mutableListOf() immutableList.add..

개발/Kotlin 2022.11.01

[Intellij] Spring 프로젝트 빌드 후, jar 실행시 ClassNotFoundException 발생 오류 해결

로컬 환경에서는 문제가 없었는데 빌드후 Executable jar을 실행하니 클래스 하나를 로드하지 못하였다. jar에 해당 라이브러리만 추가가 안 된듯 싶었다. 구글링 해 보니 다음과 같은 방법으로 추가 가능 이후 실행이 잘 되었다. Intellij를 처음써서 생기는 어이없는 오류 출처 https://youn12.tistory.com/42

개발/Intellij 2022.05.25

[Java] HashSet.contains() 를 사용하기 위한 @override hashcode()

2차원 배열에 대한 좌표 x, y를 필드로 가지는 객체를 생성후 equals() 를 정의했다. @Override public boolean equals(Object o) { if(o instanceof Pos) { Pos p = (Pos) o; return this.x == p.x && this.y == p.y; } else { return false; } } 하지만, HashSet.contains() 메서드를 사용할 때, 동일한 좌표를 가지는 객체가 존재하더라도 false를 리턴하였다. HashSet은 내부적으로 HashMap을 사용하며, HashMap은 두 객체가 동일한 키임을 판단할 때, 두 hashcode가 같아야 하며, 두 객체가 동일하거나(== 연산결과가 true) 동등해야한다.(equals(..

개발/Java 2022.04.30

[Java] HashMap의 computeIfAbsent(), computeIfPresent(), putIfAbsent() 사용정리

computeIfAbsent() 키가 존재하지 않을때 해당 람다식 실행 해당 키가 존재하던 존재하지 않던 해당 value값을 리턴한다. Map map = new HashMap(); map.computeIfAbsent(1, v -> 1); //키 1이 존재하지 않으므로 1을 삽입 map.computeIfAbsent(1, v -> 2); //키 1이 이미 존재하므로 람다식 실행안됨 System.out.println("size: " + map.size()); map.forEach((k, v) -> System.out.println(k + " " + v)); size: 1 1 1 putIfAbsent() 위의 예시처럼 단순 put 연산을 할 것이라면 putIfAbsent() 메서드를 사용하는게 더 편하다. 이 ..

개발/Java 2021.11.09

[Tomcat] 톰캣서버 Servlet 한글 깨짐문제 해결 + 이유

한글이 깨지는 이유 서버에서 웹 문서를 전송할 때, 한글을 지원하지 않는 인코딩 방식을 사용할 경우 서버에서는 올바르게 인코딩 하였으나 브라우저가 다른 인코딩 방식으로 해석한 경우 2번같은 경우는 브라우저가 문서를 받았을 때 해당 문서가 어떠한 방식의 인코딩을 사용하였는지 알지 못하기 때문에 브라우저가 자의적으로 해석하였기 때문이다. 따라서 페이지의 인코딩 방식과 패킷 헤더에 해당 인코딩 방식을 명시함으로써 문제를 해결할 수 있다. 해결방법으로는 몇 가지가 있는데 첫번쨰로는 인코딩 방식을 web.xml파일에서 지정해줄 수 있다. 하지만 일반적으로 하나의 웹 서버는 다수의 페이지가 공유하기 때문에 서버 설정파일은 잘 건드리지 않는다. 두 번째로는 각각의 페이지마다 인코딩 방식을 정해주는 것이다. respo..