본문 바로가기

Spring ElasticSearch 첨부파일 색인 스프링에서 ElasticSearch에 첨부파일 색인하는 방법입니다.  위의 코드는 클라이언트로부터 받은 첨부파일을 색인하는 insertFile 메소드입니다.(112 ~ 128라인) 먼저 멀티파트 요청의 첨부파일을 saveFileToDisk 메소드를 통해 서버에 저장합니다.(130 ~ 147라인) saveFileToDisk 메소드는 저장한 첨부파일 리스트를 리턴합니다.(146라인) 첨부파일 리스트 개수가 2개 이상이면 bulkFileElastic 메소드를 호출하고 1개면 saveFileElastic 메소드를 호출합니다.(123 ~ 127라인)  bulkFileElastic 메소드는 2개 이상의 첨부파일을 한 번에 색인하는 메소드입니다.(149 ~ 170라인) 이전에 제가 작성한 ElasticSearch b..
Java Pattern 정규표현식 자바에서 Pattern 클래스를 통해 정규표현식을 처리할 수 있습니다. 위의 테스트 코드를 보면 @CsvSource를 통해 전화번호 정규표현식을 테스트하고 있습니다. 첫번째 문자열은 테스트 문자열이고, 두번째 문자열은 기대치 문자열입니다. 전화번호 정규표현식을 생성합니다.(19라인) 메소드 체이닝을 통해 앞의 전화번호 정규표현식을 컴파일하여 Pattern 객체를 생성하고 주어진 문자열이 정규표현식에 맞는지 확인하는 Matcher 객체를 생성합니다. Matcher 객체를 통해 주어진 전화번호가 정규표현식에 맞는지 확인합니다.(22 ~ 31라인) 22라인의 전화번호 유효성 확인하는 코드를 "Pattern.matches(reg, testStr);"으로 간단하게 수정할 수 있습니다. 정규표현식에 맞으면 기대했던..
숫자 카드 나누기 프로그래머스에서 숫자 카드 나누기 문제를 풀었습니다. https://school.programmers.co.kr/learn/courses/30/lessons/135807 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제에 대한 설명은 위의 링크에서 확인하시면 됩니다.  두 개의 배열의 각각 최대 공약수가 상대편 배열의 최대공약수가 되지 않는 것이 이 문제의 핵심입니다. 먼저 배열을 오름차순으로 정렬합니다.(35 ~ 36라인) 각 배열의 최대공약수를 조회합니다.(38 ~ 39라인, 50 ~ 58라인, 60 ~ 68라인) 최대공약수를 조회할 때 유클리드 알고리..
JUnit5 MethodSource junit에서 @ValueSource, @CsvSource를 사용해서 메소드 파라미터를 전달하여 테스트를 진행합니다. 하지만 복잡한 파라미터를 전달해야 하는 경우 @MethodSource를 사용하면 됩니다.  파라미터를 생성하는 makeParams 메소드를 static으로 선언합니다.(20 ~ 26라인) static으로 선언해야 테스트 메소드를 일관성 있게 실행할 수 있기 때문입니다. File 객체, List 객체, String 객체 3개의 파라미터를  Arguments에 담아 Stream으로 테스트 메소드에 전달합니다.(21 ~ 25라인) 앞에서 작성한 makeParams 메소드로부터 파라미터를 받는 테스트 메소드를 선언합니다.(28 ~ 48라인) @MethodSource 어노테이션을 통해 makePa..
문자열 압축 프로그래머스에서 문자열 압축 문제를 풀었습니다. https://school.programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제에 대한 설명은 위의 링크에서 확인하시면 됩니다.  문자열에서 같은 문자가 연속해서 반복되는 경우 압축하는 것이 이 문제의 목표입니다. 문자열을 자르는 단위가 문자열 절반을 넘어가면 반복되는지 확인할 수 없기 때문에 루프 범위를 절반으로 설정합니다.(20 ~ 49라인) 문자열 단위만큼 연속 반복되는지 조회합니다.(..
Java thread lock synchronized 자바 멀티 스레드 환경에서 동시에 접근하는 자원이 있는 경우 동기화 처리가 필요합니다. 예를 들어 은행 계좌 이체나 티켓 예매 로직 같은 경우 동기화가 적용되어야 합니다. 위의 Ticket.java의 reserveTicket 메소드는 Lock 객체를 통해 주어진 티켓 수만큼 예매하고 있습니다.(22 ~ 35라인) Lock 객체 lock 메소드와 unlock 메소드 사이에 있는 코드는 동기화 처리되어 있어서 남아있는 티켓 수가 0보다 큰 경우 예매가 가능하고 0보다 작으면 예매가 되지 않고 있습니다. lock.lock()은 잠금을 설정하고, lock.unlock()은 잠금을 해제하고 있습니다. finally 블럭에 lock.unlock() 한 이유는 예외 발생 여부와 상관없이 잠금을 해제하기 위해서입니다...
JDK 11 FileReader Encoding JDK 11 버전부터 FileReader 생성자에 인코딩을 설정할 수 있습니다. 11 이하 버전에서 인코딩을 통해서 파일을 읽으려면 예를 들어 FileInputStream fis = new FileInputStream(fileName); InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8")); BufferedReader br = new BufferedReader(isr); 이런 식으로 InputStreamReader를 사용해야 하는데 그럴 필요 없이 FileReader로 쉽게 해결할 수 있어서 유용합니다. 인코딩이 포함된 FileReader 생성자로 파일을 읽으면 정상적으로 출력되는 것을 확인할 수 있습니다. 인코딩이 포함..
Spring ClassPathResource 스프링에서 ClassPathResource 클래스를 통해 resources 디렉토리에 있는 파일을 읽을 수 있습니다. ClassPathResource 클래스는 자바 어플리케이션에서 classpath에 있는 리소스를 읽고 로드하는 역할을 맡고 있습니다. 예제 테스트 코드는 resources 디렉토리에 있는 "test.txt" 파일을 1줄씩 읽어서 출력하고 있습니다. try-with-resources를 통해 메모리 반환을 자동으로 처리하고 있습니다. AutoClose 인터페이스를 구현한 객체는 try-with-resources에서 자동으로 메모리를 반환합니다. 예제 테스트 코드를 실행하면 정상적으로 파일 내용이 출력되는 것을 확인할 수 있습니다. application.yml 외에 다른 파일을 읽어서 로드해야..