본문 바로가기
  • Code Smell

java19

[Java] MS949(CP949)와 EUC-KR은 다르다 MS949(CP949)와 EUC-KR은 다르다 요새 대부분 UTF-8을 사용해서 MS949, EUC-KR 등을 잘 사용하지 않는다. (ASCII, ISO-8859-1 등) 하지만 레거시에서는 EUC-KR을 사용하는 경우가 꽤 있는데, 이번에 레거시에서 작업하면서 발생한 문제가 있었다. 레거시 DB는 인코딩을 us7ascii 을 사용하고 있었고, 웹은 EUC-KR로 뿌리고 있었고, 그 중간과정을 MS949로 인코딩해서 던져주었다가, EUC-KR로 변경했는데 표시못하는 한글이 발생하기 시작했다. 가만히 있는 MS949를 왜 EUC-KR로 바꾸었냐면.. 둘이 같은 줄 알았다. EUC-KR과 MS949이 같다고 표현하는 예전?블로그들이 꽤 많았고, 구글링 해가며 개발을 하다보니 그런 지식이 자연스럽게 정립되었는.. 2023. 9. 27.
[Spring] 스프링 의존성 주입 방법 스프링 의존성 주입 3가지 방법 소스는 여기서 볼 수 있습니다. 의존성 주입(Dependency Injection)은 많이 아실거라 생각합니다. Spring 에서 지원하는 의존성 주입은 3가지 방법으로 사용가능합니다. Field(필드) 주입 Setter(수정자) 주입 Constructor(생성자) 주입 예를들어 주입받아야 하는 Service가 아래와 같은 코드로 되어있다고 하겠습니다. @Service public class ExampleService { public String businessLogic() { return "OK"; } } 각각의 서비스에서 3가지 주입 방법으로 주입해 보겠습니다. 1. Field 주입 필드주입은 Spring 초창기부터 현재까지 계속 사용되는 방법입니다. 멤버 객체에 @A.. 2021. 7. 26.
[Spring Webflux] 대용량 List 병렬 처리 Spring webflux 대용량 List 처리 Mono와 Flux의 back-pressure를 이용한 publish, subscribe 를 이용하는 방법 외에 이미 만들어진 대용량 리스트를 병렬로 처리하고 싶은 경우가 있습니다. 이런 경우 ThreadPoolExecutor 등을 이용하여 처리 할 수 있겠습니다만, Config를 추가적으로 설정해야 하고, 실제로 사용하지 않는다 하여도 ThreadPool이 유지되어야 하기 때문에 사용하지 않는 자원이 낭비 될 수 있습니다. 예를들어 어떤 List의 사이즈가 10000개인데, 각 데이터에 대해 무엇인가 작업을 하고 싶은 경우 (예를들어 restTemplate으로 request 한다거나, DB에서 조회를 한다거나) 사용할 수 있습니다. asyncRestTem.. 2021. 6. 25.
[Programmers] 전화번호 목록 (Java) 문제 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조대 : 119 박준영 : 97 674 223 지영석 : 11 9552 4421 전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요. 제한 사항 phone_book의 길이는 1 이상 1,000,000 이하입니다. 각 전화번호의 길이는 1 이상 20 이하입니다. 같은 전화번호가 중복해서 들어있지 않습니다. 입출력 예제 ["119.. 2021. 5. 14.
[JUnit] JUnit5 사용법과 TDD (2) - REST API 테스트 JUnit5 사용법과 TDD (2) JUnit 5의 dependency 추가 방법과 실행 순서, 기본 annotation에 대한 정리 -> TDD 정리 1 Spring 관련 주요 Test Annotation JUnit5와 spring-boot-test의 모든 annotation은 아니며 자주 사용되는 Annotation만 소개 @ExtendWith(Class[] c) 필요한 Class들을 Configuration 으로 만들어 사용 할 수 있다. (기존 Configuration 클래스도 땡겨 올 수 있다.) Configuration Component이므로 내부에 있는 Bean 까지 등록이 가능하다. Import 된 클래스는 주입으로 사용 가능. @Profile 클래스와 메소드 레벨에서 지정 가능하며, 특정.. 2021. 3. 30.
[Java] HeapDump 파일 만들기 HeapDump 파일 만들기 Github API 등 web application, 또는 daemon 형태의 java background application 서비스를 하다보면, OutOfMemoryException이 발생하는 경우가 있다. 또한 메모리가 튈 일이 없는 상황인데도 점차 주기적으로 Heap 점유율이 늘어난다던지 하는 경우가 있는데 이런 경우 HeapDump 파일을 만들어 분석하게 되면, 어느 객체가 메모리를 많이 차지하는지, 현재 참조가 끊어진 객체들은 어떤 것들이 있는지에 대해 분석 할 수 있다. spring 프로젝트의 경우 actuator 모듈을 도입하게 되면, HeapDump 파일을 내려 받을 수 있는데, 사실 힙덤프 하나만을 위해서 actuator 도입을 해야하는 부담스러운 상황이거나.. 2021. 3. 17.
[SPRING] 스프링 캐시 사용하기 spring에서 cache 관련 된 기능을 지원한다. 기존 cache 처리라고 하면, Redis, memcached 등의 추가적인 memoryDB를 이용하거나, application 레벨에서 사용 가능한 EhCache 등이 많이 쓰이는데, 이 중 application 레벨에서 사용 가능한 spring cache에 대한 소개이다. spring cache는 cache 기능의 추상화를 지원하는데, EhCache, Couchbase, Redis 등의 추가적인 캐시 저장소와 빠르게 연동하여 bean으로 설정 할 수 있도록 도와준다. 만일 추가적인 캐시 저장소와 연결하지 않는다면, ConcurrentHashMap 기반의 Map 저장소가 자동으로 추가된다. 캐시를 쓰긴 써야하는데, EhCache까지는 쓸 필요는 없고.. 2021. 3. 11.
[LeetCode] Climbing Stairs 문제 (memoization) Climbing Stairs 문제 (memoization) 문제 링크 : https://leetcode.com/problems/climbing-stairs/ 문제의 풀이 방법은 전형적인 피보나치 수열의 합 문제였는데, 이상하게 피보나치 풀이법인 recursive 방법으로 풀면 Time Limit Exceeded 실패가 발생했다. 실행 때 마다 시간이 좀 다르니 혹시 운이 없어서 그런가 했는데, 3번을 돌려도 똑같이 실패했다. 그래서 멤버변수로 Map을 하나 만들고, 이미 지나온 값은 메모리에 들고 있는 방식(memoization)으로 문제를 풀었다. 예를들어 피보나치 수열은 아래랑 같은 공식이 성립하는데 f(n) = f(n-1) + f(n-2) f(5) = f(4) + f(3) 과 같고 f(4) = f(.. 2021. 2. 10.
[JAVA] Java Object List 중복제거 Java Object List 중복제거 Github 소스 Java8 이상의 Collections에는 Stream API 사용 시 distinct라는 중복 제거 메소드가 있다. Stream API의 distinct 메소드는 Object 의 equals 로 비교하므로 객체 자체가 같은지를 비교한다. 따라서 리터럴 형태의 String을 인자로 갖는 List등은 비교가 가능한데, Dto 형태의 모델은 비교가 안되며 Object 자체도 같은 주소값을 가지는 경우에는 가능한데 안의 속성을 비교해야 하는 경우 비교가 어렵다. 이런 경우 사용 할 수 있는 Utils 클래스이다. 아래 학생 정보를 담는 클래스가 있다고 하자 Dto Class 예 @Data public class StudentInfo { private l.. 2021. 1. 4.