property vs function

배경 코틀린 스터디 중에 커스텀 접근자(프로퍼티)와 함수를 언제 사용하면 좋을지 고민하는 시간을 가졌다. 코틀린 공식 문서 코틀린 공식 문서의 코딩 컨벤션에서는 아래의 경우 프로퍼티를 사용하는 것을 권장하고 있다. 예외를 던지지 않는다. 계산이 복잡하지 않다. (또는 최초 실행 결과가 캐시된다) 객체의 상태가 변경되지 않는 경우 호출에 대해 동일한 결과를 반환한다. 내 생각 프로퍼티를 객체의 상태를 표현하는 용도로 사용하는 것이 가장 적절하다는 생각이 들었다. 코틀린 공식 문서에서 제공하고 있는 가이드가 객체의 상태를 표현할 때만 사용한다면 위배되지 않는다....

2024-09-15 · 1 min · 78 words

properties에 비밀 번호 남는 문제 해결

현재는 일단 properties에 비밀번호를 입력하지 않고 실행시 아래와 같이 실행하도록 구현해뒀다 java -jar -Dspring.datasource.password=abcd1234 abc.jar 환경 변수를 이용하는 방법도 있다. https://stackoverflow.com/questions/37404703/spring-boot-how-to-hide-passwords-in-properties-file

2024-09-15 · 1 min · 21 words

properties vs fields

목표 인덱스 mapping 정보에서 properties와 fields의 차이점을 이해한다. properties 서브 필드를 가지고 있는 object와 nsteds 타입 매핑에서 사용된다. 새로운 속성을 추가하기 위해서 사용한다. fields 같은 필드를 다른 목적으로 사용한다는 의미다. 예를 들어, string 타입의 필드를 full-text search를 위한 text 필드와 정렬 을위한 keyword로 매핑할 때 사용할 수 있다. 참고 자료 https://www.elastic.co/guide/en/elasticsearch/reference/current/properties.html https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

2024-09-15 · 1 min · 52 words

Progressive JPEG 파일 저장

https://www.notion.so/85433ee030e7453b86ef84f399faa415 여기에서 이어지는 내용이다. JPEG파일을 Progressive JPEG로 저장되도록 구현하려고 했다. ImageWriter imageWriter = ImageIO.getImageWritersByFormatName("jpg").next(); JPEGImageWriteParam imageWriteParam = new JPEGImageWriteParam(null); imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); imageWriteParam.setCompressionQuality(0.4f); imageWriteParam.setProgressiveMode(ImageWriteParam.MODE_DEFAULT); imageWriter.setOutput(imageOutputStream); image = ImageIO.read(file); IIOImage iioImage = new IIOImage(image, null, null); imageWriter.write(null, iioImage, imageWriteParam); 위 코드와 같이 setProgressiveMode() 메서드를 사용하면 쉽게 설정이 가능하다. 참고 자료 https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kkforgg&logNo=221499435383 https://stackoverflow.com/questions/34178759/how-to-use-cfimage-to-save-image-as-progressive-jpg

2024-09-15 · 1 min · 49 words

proejct property 설정하여 Spring boot profile 설정하기

위의 방법으로 gradle을 실행시킬 때 project property를 설정할 수 있다. SPRING_PROFILES_ACTIVE=local ./gradlew build sonarqube --info 위의 방법으로 gradle 빌드할 때 spring의 프로필을 설정할 수 있다. 참고 자료 https://docs.gradle.org/current/userguide/build_environment.html#sec:project_properties https://stackoverflow.com/questions/23367507/how-to-pass-system-property-to-gradle-task

2024-09-15 · 1 min · 29 words

PriorityQueue에 이미 추가된 객체의 값을 수정하기

결론부터 생각해보면 당연하지만 코딩테스트 문제를 풀다가 실수한 내용이라 기록해본다. 이미 PriorityQueue에 추가된 값을 수정해도, 자동으로 heapify가 진행되지 않는다. 어떻게 해결했는가 PriorityQueue에 있는 값을 계속해서 수정해야 되는 경우가 있어서 soft delete 방법을 응용해서 해결했다. 값을 수정해야 되는 객체를 soft delete 시킨다. 해당 객체에서 값을 수정한 결과를 새로 인스턴스로 만들어 PriorityQueue에 추가한다. PriorityQueue에서 pop했을 때, deleted된 객체는 무시해버린다. 참고 자료 https://stackoverflow.com/questions/1871253/updating-java-priorityqueue-when-its-elements-change-priority

2024-09-15 · 1 min · 59 words

POST vs PUT vs PATCH

이를 이해하기 위해서는 멱등성이라는 개념을 알아야된다. 멱등성은 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니는지를 나타내는 성질이다. 대표적으로 GET, PUT, DELETE가 멱등성을 가지고, POST, PATCH는 멱등성을 가지지 않는다. PUT의 경우에는 요청의 body 내용을 그대로 리소스를 교체하게 되지만, PATCH는 사이드 이펙트가 있는 업데이트다. https://junroot.github.io/programming/REST/#http-메서드를-사용하여-요청의-의미를-가지게-하기

2024-09-15 · 1 min · 49 words

Pointcut Designators

목표 pointcut을 표현할 수 있는 pointcut designators를 알아본다. this, target this: 현재 호출되는 joinpoint의 위치를 제한할 때 사용 target: 메서드를 호출하는 대상 객체를 제한할 때 사용 @Pointcut("target(com.baeldung.pointcutadvice.dao.BarDao)") @Pointcut("this(com.baeldung.pointcutadvice.dao.FooDao)") args 호출하는 메서드의 파라미터를 제한할 때 사용 메서드 명이 find로 시작하고, Long 타입 파라미터 하나만 있는 경우 @Pointcut("execution(* *..find*(Long))") 메서드 명이 find로 시작하고, 파라미터 개수는 상관없지만 첫 번째 파라미터가 Long인 경우 @Pointcut("execution(* *..find*(Long,..))") @target 호출된 객체의 클래스에 지정된 어노테이션이 있는 경우로 제한할 때 사용 @Pointcut("@target(org....

2024-09-15 · 1 min · 141 words

pem 키가 필요한 인스턴스에 scp 명령어로 파이

scp -i [pem파일경로] [업로드할 파일 이름] [계정명]@[ip 주소]:~/[경로] https://ict-nroo.tistory.com/40

2024-09-15 · 1 min · 9 words

Parsing error- No babel config file detected 해결 하기

배경 vscode로 vue.js 프로젝트를 열었는데, eslint와 prettier가 적용되지 않고 제목과 같은 오류가 발생했다. 해결 방법 vscode에서 eslintrc.js 설정 파일을 자동으로 찾지 못 하고있다. vscode에서는 기본적으로 열어 놓은 디렉토리의 최상단에서 설정 파일을 찾는다. vscode에서 별도의 설정이 필요했다. settings.json "eslint.workingDirectories": [ { "mode": "auto" } ] 참고 자료 https://stackoverflow.com/questions/71271760/parsing-error-no-babel-config-file-detected-when-ide-not-open-at-vue-projects

2024-09-15 · 1 min · 47 words

Pagination 쿼리 최적화

목표 pagination 쿼리 최적화 방법을 이해한다. pagination을 사용중일 때 데이터 개수를 어떻게 구할지 이해한다. Pagination 최적화 방법 offset의 문제점 단순하게 pagination을 구현할 때, offset과 limit을 사용해서 구현한다. select * from news order by date desc, id desc limit 50 offset 4950; create index .. on news(date, id); 이 방식은 5000개의 데이터를 가져와서 4950개의 행을 버리는 방식이다. 페이지가 넘어갈수록 심각하게 느려지는 문제가 있다. 중간에 데이터가 추가되는경우, 다음 페이지네이션에 중복된 데이터가 보일 수 있다....

2024-09-15 · 2 min · 283 words

Pagination 커스터마이징

@Configuration public class PageableConfig implements WebMvcConfigurer { private static final int MAX_PAGE_SIZE = 16; @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); resolver.setOneIndexedParameters(true); resolver.setMaxPageSize(MAX_PAGE_SIZE); argumentResolvers.add(resolver); } } setOneIndexedParameters(true): 페이징 인덱스가 1부터 시작하도록 설정. 이 경우에도 PageRequest.of(1, 16) 을 호출하면 두 번째 페이지가 가져와지니 주의 해야된다. Pageable을 직접 커스터마이징 하는 것이 아니라, 컨트롤러에서 Pageable을 파라미터로 받을 때 1이 자동으로 0으로 바뀌는 것으로 추측 된다. setMaxPageSize(MAX_MAGE_SIZE): 한 페이지로 불러 올 수 있는 최대 크기를 지정한다....

2024-09-15 · 1 min · 95 words

Pagination 1부터 시작하도록 구현

2024-09-15 · 0 min · 0 words

Optional orElse() vs Optional orElseGet()

Optional<T> 기준으로 Optional.orElse()는 인자로 T 객체를 받고 orElseGet은 Supplier<? extends T> 를 받는다. orElse에 메소드를 넣어두면 null이든 아니든 항상 실행되고 orElseGet은 null일 경우에만 실행된다. 함수를 호출해야 되는 경우에는 가능하면 orElseGet을 사용하는게 좋아보인다. // Always get heavy resource getResource(resourceId).orElse(getHeavyResource()); // Get heavy resource when required. getResource(resourceId).orElseGet(() -> getHeavyResource()) 참고 자료 https://stackoverflow.com/questions/33170109/difference-between-optional-orelse-and-optional-orelseget https://velog.io/@joungeun/orElse-vs-orElseGet

2024-09-15 · 1 min · 51 words

OpenLDAP 시작하기

목표 OpenLDAP 서버를 실행한다. 아래 그림대로 엔트리를 구성한다. 서버 구동 docker container로 서버 구동 https://hub.docker.com/r/bitnami/openldap/ docker run -p 1389:1389 --name openldap bitnami/openldap:latest 클라이언트 설치 및 서버 연결 Apache Directory Studio: https://directory.apache.org/studio/downloads.html 따로 설정하지 않고 컨테이너를 실행했다면, 기본 설정값은 admin/adminpassword이다. 참고: https://hub.docker.com/r/bitnami/openldap/ 컨테이너를 실행하면, 자동으로 엔트리도 몇 개 추가된 것을 확인할 수 있다. 엔트리 구성 중 트러블 슈팅 no global superior knowledge dc=com 을 만드려고하니 아래와 같은 오류가 발생했다. 원인을 찾아보니 ldap에는 suffix라는 설정값이 존재한다....

2024-09-15 · 1 min · 173 words

OncePerRequestFilter

배경 팀 코드에 OpenPerRequestFilter를 상속한 형태의 Filter가 존재했다. 이 클래스는 어떤 역할인지 확인할 필요가 있었다. 필요한 상황 Filter는 서블릿 실행 전과 후에 호출된다. 요청이 서블릿으로 들어오면 서블릿은 다른 서블릿으로 포워딩 할 수도 있다. 이 과정에서 같은 필터를 여러 번 호출할 수도 있다. Spring은 이런 상황에서 필터가 한번만 호출되는 것을 보장시켜주기 위해 OncePerRequestFilter을 제공한다. 사용법 OncePerRequestFilter를 상속한 클래스를 정의하고, doFilterINternal() 메소드를 override하면 된다. public class AuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String usrName = request....

2024-09-15 · 1 min · 99 words

OAuth2

목표 OAuth2.0 이 무엇인지 이해한다. OAuth2.0 의 동작 방식을 이해한다. OAuth2.0 Open Authorization 웹 사이트나 애플리케이션이 다른 웹앱에 호스팅하는 리소스에 접근할 수 있도록 설계된 표준이다. 현재 온라인 인증에 대한 사실상 업계 표준으로 자리 잡고 있다. OAuth2.0 의 구성요소 Resource Owner: 애플리케이션이 자신의 계정에 접근할 수 있도록 권한을 부여하는 사용자 사용자 계정에 대한 접근 권한은 부여된 권한의 scope로 제한된다. Client: 사용자 계정에 액세스하려는 애플리케이션 사용자 계정에 접근하기 위해 Resource Owner의 승인이 필요하다....

2024-09-15 · 2 min · 266 words

Null 체크 메소드

Objects.isNull(shortestPath) 로 객체가 null인지 true, false로 반환해준다.

2024-09-15 · 1 min · 7 words

NPE 발생시 StackTrace가 로깅되지 않는 이슈

배경 NPE가 발생하고 있는 이슈가 발생해서 로그를 확인하니, 아래와 같이 로그가 남아있고 stack trace가 로깅되어 있지 않았다. java.lang.NullPointerException 원인 JVM에서 최초로 발생하는 예외를 출력하고, 이를 기억해뒀다가 자주 발생하는 것이 확인되면 더 이상 stack trace는 출력하지 하지않도록 최적화가 이루어지고 있다. 이를 기능을 사용하지 않고, 항상 stack trace를 출력하려면 아래와 같이 JVM 옵션을 추가해야된다. -XX:-OmitStackTraceInFastThrow 참고 자료 https://stackoverflow.com/questions/2411487/nullpointerexception-in-java-with-no-stacktrace

2024-09-15 · 1 min · 56 words

NIC는 1계층 2계층

아티클 마다 NIC(Network Interface Card)를 설명하는 계층이 달라서 혼란스러웠다. NIC가 어떤 레이어인지 정리해보자. NIC는 1계층이다? 1계층의 목적인 전기신호를 데이터로 변환하는 역할을 NIC가 하고있다. 따라서, NIC는 1계층 장비이다. NIC는 2계층이다? NIC에는 MAC 주소가 있기 때문이다. MAC 주소는 2계층에서 다루어지는 주소다. MAC 주소를 기반으로 전송 받은 데이터를 다음 레이어로 보낼지 말지 선택하기 때문에 2계층이다. 결론 나는 1계층 및 2계층이라고 결론을 지을 것이다. 자료를 검색할수록 각자 다른 결론을 내고 있기 때문에 정답이 없는 문제라고 생각한다....

2024-09-15 · 1 min · 86 words