본문 바로가기

분류 전체보기205

[Spring] AOP Joinpoint의 getThis()와 getTarget() AOP Joinpoint의 getThis()와 getTarget() 김영한님의 Spring 고급편을 수강하면서 수강하시는 분의 질문을 보고 작성하는 포스팅입니다. 커뮤니티의 질문을 보면 aspectj의 joinPoint를 통해 조회한 getThis()와 getTarget()의 결과가 같다는 질문이 있습니다. eclipse aspectJ doc을 확인해보면, getThis()의 경우 현재 실행중인 개체(proxy 객체)를 반환하고, getTarget()의 경우 대상 개체(class 객체)를 반환한다고 나와있습니다. @Around("com.heekng.aop.order.aop.Pointcuts.orderAndService()") public Object doTransaction(ProceedingJoinPo.. 2022. 8. 20.
[Kafka] docker를 이용해 kafka 환경 구축하기 docker를 이용해 kafka 환경 구축하기 kafka 실습 환경을 구축하면서 docker을 이용하기로 결정했습니다. 이유라 함은 처음 사용해보는 kafka이기에 설치 중 어떠한 오류가 발생할 지 모르기 때문이며, 역시나 여러 오류를 접하면서 docker을 이용하길 잘했다는 생각을 했습니다. zookeeper, kafka image pull 제 클라우드는 arm ubuntu 22.04버전을 사용하고 있습니다. 때문에 zookeeper docker image는 흔히 사용중인 wurstmeister/zookeeper를 이용하지 않았고, 각자 환경에 맞추어 이미지를 받으시면 될 것 같습니다. docker pull arm64v8/zookeeper docker pull wurstmeister/kafka dock.. 2022. 8. 16.
[Kafka] kafka의 console 명령어 Kafka의 console 명령어 kafka를 이용하면서 콘솔에 접근하여 명령어를 내려야 하는 경우 지금까지 자주 사용하던 명령어를 정리하고자 합니다. topic 생성하기 ./kafka-topics.sh --create --bootstrap-server [ip:port] --replication-factor [replication] --partitions [partitions] --topic [topicName] topic을 생성합니다. --bootstrap-server: 카프카 서버의 주소를 입력합니다. --replication-factor: replication의 수를 입력합니다. --partitions: 해당 토픽의 partition 수를 입력합니다. --topic: 해당 토픽의 이름을 지정합니다... 2022. 8. 16.
[Kafka] kafka에 대해 알아보자 - 2 kafka에 대해 알아보자 Partitioner(파티셔너)란? producer가 데이터를 보내면 partitioner를 통해서 브로커로 데이터가 전송됩니다. 파티셔너는 데이터를 토픽의 어떤 파티션에 넣을 지 결정하는 역할을 합니다. 레코드에 포함된 메시지 키 또는 메시지 값에 따라서 파티션의 위치를 결정하는 역할을 합니다. 파티셔너는 메시지 키가 있을 때와 없을 때 다르게 동작하게 됩니다. 만약, 파티셔너를 따로 설정하지 않았다면 UniformStickyPartitioner로 설정됩니다. 메시지 키가 있을 때 메시지 키를 가진 레코드는 파티셔너에 의해서 특정한 해쉬값이 생성됩니다. 이 해쉬값을 기준으로 어떤 파티션에 저장될 지 결정됩니다. 토픽에 파티션이 두개가 있는 경우 동일한 키를 가진 레코드는 동일.. 2022. 8. 15.
[Kafka] kafka에 대하여 알아보자 - 1 kafka에 대하여 알아보자 요즈음 여러 서버개발자 채용공고에 공통적으로 나타나는 기술중엔 kafka가 있습니다. 이전에는 kafka가 message queue라는 것만 알고, 이를 왜 사용하는지 이해하지 못했는데 시간이 난 김에 한번 공부해보려 합니다. kafka란? kafka란 데이터를 제공하는 sourceApplication과 데이터를 이용하는 targetApplication의 커플링을 약하게 하기 위해 나타났습니다. sourceApplication -> targetApplication의 형태로 이동하던 데이터를 sourceApplication -> kafka -> targetApplication의 형태로 중간에 kafka가 위치하게 됩니다. kafka는 json, tsv 등의 여러 포맷의 데이터를.. 2022. 8. 15.
[Spring] kotlin spring lazy loading 삽질기 Kotlin spring lazy loading 삽질기 kotlin+spring 시작하기에 이어 기존에 만들었던 crud 위중의 프로젝트를 kotlin+spring 프로젝트로 변경하던 중 JPA와 Jackson 그리고 Jpa의 LazyLoading으로 인해 몇 시간 동안 붙잡게 되었습니다. 이를 해결하기 위해 진행했던 방법, 결과적으로 잘못되었던 점에 대해 짚어보려 합니다. allOpen 옵션 열어두기 먼저 kotlin의 open에 대해 알아보면, java와 다르게 kotlin의 클래스는 기본적으로 final으로 설정되어 있습니다. hibernate에서 사용하는 CGLIB는 상속을 기반으로 프록시 기술을 사용하기 떄문에 코틀린 클래스에 대해 상속을 열어두어야 프록시 기술을 사용할 수 있습니다. 기존의 b.. 2022. 8. 13.
[Spring] kotlin + Spring 시작하기 Kotlin + Spring 시작하기 최근 취업 준비를 하며 코틀린에 대한 필요성을 느꼇고, 코틀린을 공부해 보았습니다. 뒤이어 Spring에 Kotlin을 적용해 일명 코프링프로젝트를 시작하기로 했습니다. 버전의 경우 제 현재 프로젝트의 버전이 입력되어 있습니다. 때에 따라 다르게 적용하시면 됩니다. build.gradle - 코틀린 적용 plugins { ... id 'org.jetbrains.kotlin.jvm' version '1.6.21' id 'org.jetbrains.kotlin.plugin.spring' version '1.6.21' ... } dependencies { ... implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' implem.. 2022. 8. 10.
[Kotlin] 여러가지 기능 여러가지 기능 Type Alias Kotlin typealias FruitFilter = (Fruit) -> Boolean fun filterFruits(fruits: List, filter: FruitFilter) { } typealias USGTMap = Map data class UltraSuperGuardianTribe( val name: String ) typealias: 긴 이름의 클래스 혹은 타입이 있을 때 축약하거나 더 좋은 이름을 쓰고싶을 때 사용할 수 있다. as import Kotlin import com.heekng.kotlinStudy.kotlin.lec12.Person as PersonA import com.heekng.kotlinStudy.kotlin.lec16.Person a.. 2022. 7. 7.
[Kotlin] 컬렉션을 함수형으로 사용하기 컬렉션을 함수형으로 사용하기 필터와 맵 filter filterIndexed: filter에 index를 포함하여 사용 map mapIndexed: map에 index를 포함하여 사용 mapNotNull: mapping의 결과가 null이 아닌 것만 가져와 map 다양한 컬렉션 처리 기능 all: 조건을 모두 만족하면 true 그렇지 않으면 false none: 조건을 모두 불만족하면 true 그렇지 않으면 false any: 조건을 하나라도 만족하면 true 그렇지 않으면 false count(): 개수를 센다. sortedBy: 오름차순 정렬 sortedByDescending: 내림차순 정렬 distinctBy: 변형된 값을 기준으로 중복을 제거한다. first(): 첫번째 값을 가져온다 (무조건 n.. 2022. 7. 7.