m1 mac에서 homebrew 사용시 경로

배경 homebrew를 사용해서 Apache를 설치했는데 예상한 위치에 설치되지 않았다. Intel 사용시 경로 vs M1 사용시 경로 intel의 경우에는 기본 경로가 /usr/local/bin/brew 이다. m1의 경우에는 기본 경로가 /opt/homebrew/bin 이다. which brew 명령을 통해서 현재 brew가 설치되어 있는 위치가 어디인지 파악할 수 있다. 참고 자료 https://earthly.dev/blog/homebrew-on-m1/

2024-09-15 · 1 min · 44 words

lower_bound, upper_bound 바이너리 서치

python에서 자체적으로 함수로 제공하고 있다. lower_bound: bisect_left(literable, value) upper_bound: bisect_right(literable, value) 참고 자료 https://docs.python.org/3/library/bisect.html

2024-09-15 · 1 min · 14 words

Lombok

롬복을 통해 쉽게 생성자, getter, setter, 빌드 패턴이 구현된다. @Builder @Getter @AllArgsConstructor @NoArgsConstructor @Entity public class Game { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NonNull private String name; } access 속성으로 접근 제어자 지정할 수 있다. @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED)

2024-09-15 · 1 min · 41 words

logrotate의 config 파일이 root 소유자가 아니면 실패하는 이슈

발생한 문제 logrotate 명령어 수행시 error: Ignoring {config 파일 경로} because the file owner is wrong (should be root or user with uid 0). 가 발생함 이전 서버 환경에서는 이런 문제가 없었는데 신규 서버에서 발생함 원인 logrotate 3.8.0 부터 root 권한으로 logrotate 실행 시, config 파일의 파일 소유자가 root 인지 검증한다. 이전 서버에서는 3.8.0 보다 낮은 버전이어서 문제가 되지 않았다. https://github.com/logrotate/logrotate/blob/master/ChangeLog.md https://github.com/logrotate/logrotate/compare/r3-7-9...r3-8-0 참고 자료 https://superuser.com/questions/793013/logrotate-no-longer-reads-symlinked-configuration-file-due-to-non-root-ownership

2024-09-15 · 1 min · 65 words

logrotate

목적 Linux에 존재하는 로그 로테이팅 명령어다. logrotate 는 로그 로테이트 과정을 관리하는데 사용되고, cron을 통해서 보통 실행한다. logrotate 실행에 필요한 파일 /usr/sbin/logrotate: logrotate 명령어(실행 파일) /etc/cron.daily/logrotate: anacron을 이용해 매일 실행할 logrotate /etc/logrotate.conf: 로그 로테이트 설정 파일 conf 파일 아래와 같이 로테이트 할 로그 파일 경로와 설정을 명시한다. 정규식을 이용한 표현도 가능하다. /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc....

2024-09-15 · 1 min · 189 words

log4j vs logback vs log4j2

Java 진영의 대표적인 로깅 프레임워크 log4j, logback, log4j2를 비교해보고자 한다. log4j 가장 오래된 로깅 프레임워크이다. 하지만 그만큼 몇 년 동안 가장 인기있는 프레임워기도하다. 최근에 나온 로깅 프레임워크도 log4j의 계층적 로그 레벨과 로거 같은 개념을 사용하고 있다. 하지만, log4j는 2015년에 개발이 종료되었다. 새로운 프로젝트에서는 해당 프레임워크를 사용하는 것을 권장하지 않는다. logback log4j의 후계자로 log4j와 같은 개발자가 만들었다. log4j와 전체적으로 동일한 개념을 사용하지만 성능이 개선되고 고급 필터링 및 설정 등을 제공하고 있다....

2024-09-15 · 1 min · 108 words

LocalStorage에 데이터 저장, 조회하기

데이터 저장 window.localStorage.setItem('myCat', 'Tom'); 데이터 조회 const cat = localStorage.getItem('myCat') // 없으면 null 데이터 삭제 localStorage.removeItem('myCat'); 데이터 전체 삭제 localStorage.clear(); 참고 자료 https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage

2024-09-15 · 1 min · 23 words

Locale 처리 방식

목표 locale이 무엇인지 이해한다. Spring에서 locale을 어떻게 처리하는지 이해한다. Locale 지리적, 문화적, 정치적 지역을 나타내는 역할을 가지는 클래스 언어, 국가 등을 표현한다. Spring에서 Locale 처리 방법 Spring 애플리케이션에서 요청자의 지역에 따라 다른 언어를 표시하기 위해서는 현재 Locale을 결정하는 방법이 있어야 된다. DispatcherServlet은 locale resolver를 찾고, 찾은 locale resolver를 통해서 locale을 지정하려고 시도한다. RequestContext.getLocale() 메서드 호출을 통해 locale resolver가 설정한 locale을 확인해 볼 수 있다. LocaleResolver LocaleResolver: locale을 선택하기 위한 전략을 나타내는 전략 인터페이스 대표적인 기본 구현체 AcceptHeaderLocaleResolver: HTTP 요청의 Accept-Language 헤더를 통해 locale을 선택한다....

2024-09-15 · 1 min · 185 words

LocalDate, LocalDateTime 변환

LocalDate → LocalDateTime 시간을 지정해줘야 되나는 문제가 있다. atStartOfDay() 메서드는 0시 0분 0초로 시간이 매핑된다. atTime()은 자신이 원하는 시간을 LocalTime 이나 (시, 분, 초) 형태로 파라미터를 입력할 수 있다. LocalDateTime localDateTime1 = localDate.atStartOfDay(); LocalDateTime localDateTime2 = localDate.atTime(LocalTime.now()); LocalDateTime localDateTime3 = localDate.atTime(04, 30, 56); LocalDateTime → LocalDate LocalDate localDate = localDateTime.toLocalDate(); 참고 자료 https://howtodoinjava.com/java/date-time/localdate-localdatetime-conversions/

2024-09-15 · 1 min · 53 words

List에서 element 개수 Map으로 만들기

목표 [1, 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 5]의 경우, {1=2, 2=2, 3=1, 4=3, 5=5} 로 만들어주는 로직이 필요했다. groupingBy 코틀린 확장 함수 keySelector라는 함수를 함수를 명시해서 각 element에 key를 추출한다. key별로 그룹핑한 값들을 Grouping<T, K> 클래스로 래핑한다. T가 원래 타입, K가 key의 타입이 된다. Grouping<T, K> 클래스에서 eachCount()를 호출하면 각 그룹의 element 개수를 Map<K, Int> 형태로 반환한다. val words = "one two three four five six seven eight nine ten"....

2024-09-15 · 1 min · 99 words

LDAP 이해하기

목표 LDAP이 무엇인지 이해한다. LDAP의 장단점을 이해한다. LDAP란? LDAP: Lightweight Directory Access Protocol 디렉토리에 접근하기위해 사용되는 애플리케이션 레이어의 프로토콜(디렉토리 서비스 프로토콜) 우리가 흔히 알고있는 디렉토리처럼 계층적 트리 구조를 가지고 있다. LDAP vs RDBMS 데이터를 저장하고 조회한다는 관점에서 LDAP도 데이터베이스라고 할 수 있다. 우리가 가장 흔하게 사용하고 있는 관계형 데이터베이스와 차이점을 비교해보며 장단점을 파악한다. 읽기가 쓰기보다 훨씬 많은 경우는 LDAP이 유리하다. (1000:1 비율보다 읽기가 더 많은 경우) LDAP RDBMS 검색과 조회 연산에 최적화되어 있다....

2024-09-15 · 1 min · 147 words

LDAP 기본 개념

Directory service 디렉토리: 검색 및 조회에 특화된 데이터베이스. 업데이트도 가능하다. 주로, 속성(attribute)기반의 정보를 포함하고, 정교한 필터링 기능을 지원한다. 대량의 복잡한 업데이트를 처리하도록 설계된 데이터베이스에서 볼 수 있는 트랜잭션과 롤백을 지원하지 않는다. 대량의 조회 또는 검색 작업에 빠르게 응답하도록 설계되었다. 가용성과 신뢰성을 높이고, 응답 시간을 단축하기 위해서 복제(replicate) 해두기도 한다. 데이터 복제 중에 발생하는 일시적인 데이터 불일치는 허용한다. 디렉토리 서비스는 여러 방법으로 제공된다. 디렉토리 서비스마다 정보의 종류가 다르고 조회, 업데이트 방법 등이 다를 수 있다....

2024-09-15 · 2 min · 309 words

Language Injections

목표 IntelliJ의 Language injections 기능이 무엇인지 이해한다. Language injections 사용 방법을 이해한다. Language injections 코드 내에 일부분을 다른 언어로 코드 어시스턴트를 받을 수 있는 기능 사용법 임시로 language injection 사용 원하는 영역에서 ⌥(Opt) + ↩(Enter)를 누르고, “Inject language or reference"를 누른다. 영구적으로 language injection 사용 원하는 영역에 @Language 애노테이션을 붙이면 IntelliJ에서 자동으로 language injection을 해준다. 적용 전 적용 후 참고 자료 https://www.jetbrains.com/help/idea/using-language-injections.html#language_annotation

2024-09-15 · 1 min · 62 words

Kotlin에서 getClass()

배경 Java에서 Class<T> 타임을 파라미터로 받는 메서드를 코틀린에서 사용할 필요가 있었다. KClass 코틀린에서는 Class<T>와 비슷하게 KClass<T>를 제공하고 있다. 아래와 같은 방식으로 타입을 얻을 수 있지만 Class<T>와는 같지 않다. String::class 자바의 타입을 얻고 싶다면, 아래와 같이 kotlin.jvm에서 제공하고 있는 확장 프로퍼티를 이용할 수 있다. String::class.java

2024-09-15 · 1 min · 44 words

Kotlin과 함께 사용시 발생할 수 있는 문제

배경 Kotlin과 Java를 혼용해서 사용하고, Java에서 롬복을 사용하고 있으면 문제가 발생할 수 있다. @Getter를 사용했음에도, Error: Cannot access ’name’: it is ‘private’ in “Person” 같이 프로퍼티에 접근할 수 없는 것을 확인할 수 있다. 이는 Lombok이 코드를 생성하는 단계보다 Kotlin 컴파일러가 코드를 컴파일 하는 과정이 먼저 이루어지기 때문에 발생하는 문제다. 아래 사진에서 Lombok 코드 생성은 Annotation Processing 단계에서 처리된다. 해결 방법 1. 빌드 전처리 과정에서 Delombok 실행 Lombok에서 제공해주고 있는 기능으로 Lombok 코드를 직접 먼저 실행하게 한다....

2024-09-15 · 1 min · 104 words

Kotlin과 사용시 open 해야되는 문제

배경 스프링은 트랜잭션 등의 AOP를 지원하기 위해 CGLIB을 사용하여 프록시를 만들기 위해, 클래스들을 동적으로 상속한다. 따라서, final 클래스는 컴포넌트로 사용할 수 없다. Kotlin 클래스는 기본값이 final 이므로 매번 open 키워드를 붙여줘야되는 번거로움이 있다. kotlin-maven-allopen 이를 해결해주기 위해 kotlin에서는 kotlin-maven-allopen이라는 플러그인을 제공해준다. @Configuration이나 @Transactional, @Component 등 스프링 관련 어노테이션이 붙어있는 클래스나 메서드는 자동으로 open 시켜서 CGLIB에 사용할 수 있게 해준다. <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <configuration> <compilerPlugins> <plugin>spring</plugin> </compilerPlugins> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-allopen</artifactId> <version>${kotlin....

2024-09-15 · 1 min · 79 words

Kotlin과 Java 혼용시 Checked Exception 알려주기

상황 코틀린에서는 Checked Exception을 따로 처리해주지 않는다. 자바에서 Checked Exception을 catch 해서 처리해주고 싶은데 이가 문제가 되었다. 해결 방법 코틀린에 @Throws 어노테이션을 사용하면 자바에서 checked exception 처리가 가능해진다. @Throws(IOException::class) fun foo() { throw IOException() } 참고 자료 https://kotlinlang.org/docs/java-to-kotlin-interop.html#checked-exceptions https://stackoverflow.com/questions/36528515/throws-exception-in-a-method-with-kotlin

2024-09-15 · 1 min · 39 words

Kotlin takeIf

목표 takeIf() 함수의 목적을 이해한다. takeIf inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? predicate가 true면 this를 리턴하고, false면 null을 리턴한다. 참고 자료 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/take-if.html

2024-09-15 · 1 min · 24 words

Kotlin Contracts

목표 Kotlin contracts가 무엇인지 이해한다. Kotlin contracts의 사용법을 이해한다. 배경 아래 사진과 같이 validate() 함수에서 request의 null 검사를 했음에도 불구하고, process는 다른 함수여서 스마트 캐스트가 이루어지지 않는다. Kotlin contracts를 사용하면 이 문제를 해결할 수 있다. Kotlin contracts는 컴파일러에게 함수의 동작을 알려준다. 스마트 캐스트 contract() 메서드를 호출되는 함수에 선언하고, 내부에 함수의 동작을 명시한다. returns(): 함수가 정상적으로 리턴되는 경우를 의미한다. implies(): 파라미터로 받은 booleanExpression이 항상 참임을 보장한다. 실험적인 단계의 contract API를 사용하는 함수에는 @OptIn(ExperimentalContracts:class)를 붙여주거나 컴파일 인자로 -opt-in=kotlin....

2024-09-15 · 1 min · 183 words

keyword의 최대 길이

배경 fields 매핑을 이용해 특정 text를 keyword로도 사용할 수 있도록 설정해둠 그러나 keyword 필드에 값이 존재하지 않음 원인 keyword 타입 매핑시에 처리 가능한 최대 길이를 설정할 수 있다. "ignore_above" : <자연수> 옵션이며, 다이나믹 매핑으로 keyword가 생성될 때는 기본값인 256으로 설정된다. 참고 자료 https://esbook.kimjmin.net/07-settings-and-mappings/7.2-mappings/7.2.1#keyword https://www.elastic.co/guide/en/elasticsearch/reference/current/ignore-above.html

2024-09-15 · 1 min · 44 words