backend 117

[Kotlin] 코틀린 MapStruct 적용 및 사용하기 (feat.gradle)

서버 작업을 하면 빈번하게 필요한 Model과 DTO 변환을 필드 선언만 해놓으면 자동으로 변환해주는 MapStruct를 Java 작업할때 많이 사용하는데요. Kotlin에서도 적용해보았습니다. Kotlin MapStruct 적용 build.gradle.kts 파일에 추가해줍니다. // build.gradle.kts plugins { kotlin("kapt") version "1.7.10" } subprojects { apply(plugin = "kotlin-kapt") dependencies { implementation("org.mapstruct:mapstruct:1.5.2.Final") kapt("org.mapstruct:mapstruct-processor:1.5.2.Final") kaptTest(..

backend/Kotlin 2022.09.02

[Kotlin] 가변 컬렉션과 읽기 전용 컬렉션 구분하기

이펙티브 코틀린 책을 읽고 간단히 정리해본 것입니다. 아이템1. 가변성을 제한하라. - 가변 컬렉션과 읽기 전용 컬렉션 구분하기 중에서 읽기 전용 컬렉션 Iterable, Collection, Set, List 인터페이스 읽고 쓸수 있는 컬렉션 MutableIterable, MutableCollection, MutableSet, MutableList 인터페이스 - 읽기전용 인터페이스를 상속 받아, 변경을 위한 메서드만 추가. Iterable 과 MutableIterable 인터페이스 package kotlin.collections import kotlin.internal.PlatformDependent /** * Classes that inherit from this interface can be rep..

backend/Kotlin 2022.08.02

[Kotlin] 읽기 전용 프로퍼티 - val property

다음 내용은 이펙티브 코틀린 책을 읽고 간단히 정리해본 것입니다. 아이템1. 가변성을 제한하라. - 읽기 전용 프로퍼티(val) 중에서 읽기 전용 프로퍼티인 val에 대해 정리해보자. val a = 10 //a = 20 // 재할당 불가. val list = mutableListOf(1, 2, 3) // 읽기 전용 프로퍼티(val)로 선언되었어도 mutable 객체를 담고 있다면 내부적으로 변환 가능 list.add(4) print(list) //list = mutableListOf(5) //val 로 선언되었다면 재할당이 불가능 '프로퍼티를 읽을 수만 있다는 속성(읽기 전용)'과 '값이 변할 수 없는 것(가변성)'을 구분해서 생각해야한다. var 프로퍼티를 사용하는 val 프로퍼티는 var 프로퍼티가 ..

backend/Kotlin 2022.07.30

[Spring] WebClient DataBufferLimitException WebFlux 오류 해결

글 작성시의 버전 Springboot : 2.3 버전 / Spring webflux : 5.2 버전 문제 WebClient를 통해 데이터를 가져오는데 데이터의 용량이 너무 커서 메모리 버퍼사이즈가 초과해서 DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144 에러가 발생했습니다. 해결 application memory 이슈를 피하기 위해 Codecs는 버퍼 데이터 사이즈를 제한을 두었습니다. 기본값으로 256KB이고, 만약 이 값이 충분하지 않을 경우에는 기본 코덱 설정값을 바꿔줘야합니다. WebClient를 build시 codec 설정을 넣어주면 되는데요. 특정사이즈(예 10MB)로 하고 싶다면? 10 * 1024 * 1024..

backend/Spring 2022.04.10

[Python, Selenium] Selenium webdriver executable_path deprecated warning 해결

개발환경 Python version : 3.9 Selenium version : 4.1.0 Chrome driver verison : Latest stable release: ChromeDriver 97.0.4692.71 python + selenium을 아래 코드로 작성하니 deprecated warning이 떴다 from selenium import webdriver driver = webdriver.Chrome(executable_path='/Users/buri/Downloads/chromedriver') driver.get(url) console output: DeprecationWarning: executable_path has been deprecated, please pass in a Ser..

backend 2022.01.09

[SpringData JPA] query method predicate keywords - null이 아닌 빈값을 제외하고 싶을때

보통은 컬럼값에 null이거나 null이 아닌 값을 쿼리하는 경우가 많은데 가끔 빈값으로 데이터를 채워 넣고 빈값("")이 아닌 데이터를 쿼리해서 리턴해야할 경우가 있다. 예) phoneNumber != "" Spring Data JPA에서 기본으로 제공하는 repository method명에는 isEmpty나 isBlank같은건 없다. 대신 method의 argument로 빈값("")을 넘겨 받도록 하고 Not 을 써주면 된다. repository.findByPhoneNumberNot("") https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords Spring Data JPA - Referen..

backend/Spring 2021.10.14

[Junit5] SpringBoot 2에 JUnit5 적용

이 문서는 SpringBoot2.0 의 기본인 Junit4 대신에 Junit5를 적용해보면서 정리해봅니다. (기준 버전 junit 5.5.1, SpringBoot 2.0 버전) 공식 문서의 축약 버전입니다. 참고. SpringBoot 2.2.0 버전에서는 junit5 에서는 기본으로 변경됨. https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#junit-5 JUnit5 ? JUnit 5은 기존버전과 다르게 3개의 sub-project로 이뤄져있다. JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage JUnit Platform : JVM 기반 테스팅 프레임워크를 ..

backend/Spring 2019.08.22

[Junit5] SpringBoot2+Junit5 에서 TestEngine with ID 'junit-jupiter' failed to discover tests 오류 해결방법

Spring Boot 의 기본 junit4 대신 junit5(2019.7월 말 현재 최신버전인 junit 5.5.1 )를 쓰기 위해 설정하는 도중 만난 오류가 있어서 공유합니다. 개발 환경 IngelliJ IDEA gradle 5.0 Spring Boot 2.1.0.RELEASE Spring Boot 의 기본 junit4 대신 junit5(2019.7월 말 현재 최신버전인 junit 5.5.1 )를 쓰기 위해 설정하는 도중 만난 오류가 있어서 공유합니다. Spring Boot 의 기본 junit4 버전 제외. (build.gradle) testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude module: 'juni..

backend/Spring 2019.07.26 (2)

[Java] Java Interface feature 변화의 history - 번역

History of Java interface feature changes 원문 : https://www.vojtechruzicka.com/java-interface-history/ 지나가며 글을 읽다가 빠른 번역(잘못된 번역이 많을 수 있습니다)을 해보았습니다. Original interfaces java 1.0의 interface는 두개의 type만 포함한다. constants와 public abstract methods. Constant fields Inteface는 field를 포함하고, 보통의 class와는 몇가지 차이점이 있다. - Fields는 value가 할당되어야 한다.(Fields must be assigned a value) - Fields는 public static final로 간주..

backend/Java 2019.07.17

[Spring] Lazy Initialization in Spring Boot 2.2 - 번역

Lazy Initialization in Spring Boot 2.2 https://spring.io/blog/2019/03/14/lazy-initialization-in-spring-boot-2-2 위의 글을 읽다가 조금만 번역해 보았습니다. 잘못된 부분이 있을 수 있으니 있다면 제보해주세요~ What Does it Mean to be Lazy? Spring Framework는 기본적으로 application context가 refresh될때 context의 모든 bean을 생성하고 dependency들을 inject(주입)된다. 대조적으로 bean definition이 느리게 초기화되도록 설정되면, 필요할 때까지는 dependency가 inject되지 않는다. Lazy Initialization 활성..

backend/Spring 2019.07.16

[Java] Java Iterator를 Java Stream 으로 변환하기

원문 Java Iterator to Java 8 Stream 을 가볍게 번역한 글입니다. list 대신 Iterator 객체를 반환하는 다른 라이브러리를 써야할 때가 있는데, 라이브러리의 관점에서는 문제가 없지만 반환된 iterator에서 Java 8 stream을 사용하려는 경우 문제가 될 수 있다.Iterator를 Iterable로 변환한 다음 쉽게 stream 쓸 수 있는 방법이 있다. Iterator iterator = elements.iterator(); Iterable valueIterable = () -> iterator; List StreamSupport.stream(valueIterable.spliterator(), false) .map(element -> element.asString(..

backend/Java 2018.09.07 (1)

[책] 함수형 사고 - Chapter 2. 전환 - 2.4 골치 아프게 비슷비슷한 이름들.

[책] 함수형 사고 - Chapter 2. 전환 책 함수형 사고(Functional Thinking)을 읽고, 관련 예제를 살펴보며 간단 정리한 것입니다. 책 예제와는 조금 다를 수도 있습니다. 참고) 영문 책의 예제 https://github.com/oreillymedia/functional_thinking 2.4 골치 아프게 비슷비슷한 이름들 - 스칼라 버전 /** 필터(filter) **/ //각 숫자가 3으로 나뉘어야 한다는 조건을 가진 코드 블록을 filter() 함수를 적용한다. val numbers = List.range(1, 11) numbers filter (x => x % 3 == 0) //res0: List[Int] = List(3, 6, 9) //스칼라에서는 매개변수를 언더바로 치환..

backend 2018.07.22

[책] 함수형 사고 - Chapter 2. 전환

책 함수형 사고(Functional Thinking)을 읽고, 관련 예제를 살펴보며 간단 정리한 것입니다.책 예제와는 조금 다를 수도 있습니다. 참고) 영문 책의 예제https://github.com/oreillymedia/functional_thinking Chapter 2. 전환 명령형 처리명령형 프로그래밍이란 상태를 변형하는 일련의 명령들로 구성된 프로그래밍 방식.전형적인 for 루프가 명령형 프로그래밍의 훌륭한 예. 초기 상태를 설정하고 되풀이할때마다 일련의 명령을 실행한다. 명령형 프로그래밍은 개발자로 하여금 루프 내에서 연산하기를 권장한다. 책에 나와 있는 예제에서는 세가지를 실행했다.한 글자짜리 이름을 필터했고, 목록에 남아있는 이름들을 대문자로 변형하고, 이 목록을 하나의 문자열로 변환했다..

backend 2018.07.22

[책] 함수형 사고 - Chapter 1. 왜

책 함수형 사고(Functional Thinking)을 읽고, 관련 예제를 살펴보며 간단 정리한 것입니다. 책 예제와는 조금 다를 수도 있습니다. 참고) 영문 책의 예제 https://github.com/oreillymedia/functional_thinking Chapter 1. 왜 전혀 새로운 프로그래밍 패러다임의 문제는 새로운 언어를 배우는 것이 아니고, 다른 방식으로 사고하는 법을 배우는 것. 객체지향 프로그래밍은 움직이는 부분을 캡슐화하여 코드 이해를 돕고, 함수형 프로그래밍은 움직이는 부분을 최소화하여 코드 이해를 돕는다. - 마이클 페더스 함수형 개발자는 적은 수의 자료구조와 그것들을 잘 이해하기 위한 최족화된 방법을 만들기를 선호한다. 객체지향형 개발자는 항상 새로운 자료구조와 그것에 부착..

backend 2018.07.15

[Akka] Akka Document - Actor Architecture (3) - Failure handling

이 글은 원문 : https://doc.akka.io/docs/akka/current/guide/tutorial_1.html 글을 읽고 간략하게 정리한 내용입니다. (생략된 내용도 있습니다.) Akka Version 2.5.12 Failure handling 부모와 자식은 라이프 사이클 전반에 걸쳐 연결된다. actor가 실패 할 때마다 (예외를 던지거나 처리되지 않은 예외가 receive에서 끊어지면) 일시적으로 일시 중단된다. 앞서 언급했듯이, 실패 정보는 부모에게 전달되며, 부모는 자식 actor에 의해 발생한 예외를 처리하는 방법을 결정합니다. 이런 식으로 부모는 자식을 감독하는 역할을 한다. 기본 수퍼바이저 전략은 자식을 중지했다가 다시 시작하는 것이다. 기본 전략을 변경하지 않으면 모든 실패로..

[Akka] Akka Document - Actor Architecture (2) - actor lifecycle

이 글은 원문 : https://doc.akka.io/docs/akka/current/guide/tutorial_1.html 글을 읽고 간략하게 정리한 내용입니다. (생략된 내용도 있습니다.) Akka Version 2.5.12 The actor lifecycle actor가 만들어지면 존재하게되고 나중에 사용자 요청에 따라 멈추게 된다. actor가 멈추면 모든 자식도 재귀적으로 멈춘다. 이 동작은 리소스 정리를 크게 단순화하고 열린 소켓 및 파일로 인해 발생하는 리소스 유출을 방지하는 데 도움이 된다. 사실 저수준 멀티 스레드 코드를 처리 할 때 일반적으로 간과되는 어려움은 다양한 동시 자원의 라이프 사이클 관리하는 것이다. actor를 정지 시키려면, actor 내에서 getContext().sto..

[Akka] Akka Document - Actor Architecture (1)

이 글은 원문 : https://doc.akka.io/docs/akka/current/guide/tutorial_1.html 글을 읽고 간략하게 정리한 내용입니다. (생략된 내용도 있습니다.) Akka Version 2.5.12 Part 1: Actor Architecture Akka를 사용하면 actor system 을 위한 인프라를 만들고 기본 동작을 제어하는 데 필요한 저수준 코드를 작성하지 않아도 된다. 이를 이해하기 위해 코드에서 생성한 actor와 Akka가 생성하고 관리하는 actor 사이의 관계, actor 라이프 사이클 및 오류 처리를 살펴본다. The Akka actor hierarchy Akka의 actor는 항상 부모에게 속한다. 일반적으로 context.actorOf ()를 호출하..

[Scala] Mac에서 Scala 설치

Mac에서 Scala 설치 설치 환경os : mac / jdk : 1.8 / 설치할 scala : 2.11.8 0. JDK 설치 확인 및 미설치시 먼저 설치할 것. 1. Scala 공식 홈페이지로 접속http://www.scala-lang.org/ 2. Download 버튼 클릭 후 현재 안정화 된 버전의 Scala 버전 다운로드 3. 다운받은 zip 파일을 적당한 곳(예: /usr/local)에 압축을 푼다. 4. SCALA_HOME Path 설정(예: ~/.profiles)아래와 같이 압축해제한 scala 폴더의 위치 HOME으로 설정후 bin 폴더를 PATH에 추가한다.export SCALA_HOME=/usr/local/scala-2.11.8 export PATH=$PATH:$SCALA_HOME/b..

[Play] Play설치(activator)

글 작성 기준 버전 : Play 2.5.x 참고 : https://www.playframework.com/documentation/2.5.x/Installing Prerequisites Play 2.5.x 버전은 java 1.8 을 필요로 한다. Play 설치 activator 다운로드 https://playframework.com/download에서 Offline Distribution 클릭하여 다운로드 받는다. /usr/local이나 쓰기권한있는 원하는 위치에 압축을 풀어준다. Path에 activator 추가. 자신의 profile 파일에 path를 추가한다. MacOS/Linux는 보통 $HOME/.profile 에 추가한다. (/etc/paths에 추가하기도 하고 자신이 쓰는 path 지정하면 ..

[SpringSecurity] Authentication(인증) 관련 클래스와 처리

Spring Security에 대해 큰 흐름은 알지만, 처음부터 적용하는게 아니면 어떤 권한을 주고 권한 체크하는 로직만 추가하거나 수정하며 생각없이 쓰게 되는데,어떤 흐름으로 되는지 전보다 좀 더 살펴볼 기회가 있었고 Spring Security의 각 클래스들이 어떤 일을 하는지에 대해 두서없이 소소하게 정리해봅니다.이 글에서 Spring Security Version은 3.2.5 버전이 기준입니다. 1. 인증과 인가란 무엇인가? 인증 절차를 거친후 인가 절차를 진행! 1) 인증(Authentication) : 해당 사용자가 본인이 맞는지를 확인하는 절차.2) 인가(Authorization) : 인증된 사용자가 요청된 자원에 접근가능한지를 결정하는 절차. 2. 인증 방식1) credential 기반 인..

backend/Spring 2016.01.25

[Scala] Scala에서의 객체 동등성

Scala에서의 객체 동등성 동등성 : 두 객체의 내용이 같은지 비교. String Equality 테스트 == operator를 이용한 두개의 String instance 비교. val s1 = "hello" val s2 = "hello" val s3 = "h" + "ello" s1 == s2 res0: Boolean = true s1 == s3 res1: Boolean = true == 메소드는 String 이 null로 할당하여도 NullPointerException발생하지 않음. val s4: String = null s3 == s4 res2: Boolean = false s4 == s3 res3: Boolean = false 대문자나 소문자로 변환한 두개의 string도 == method를 이용..

CouchDB 관련 링크

공식 Apache CouchDB homepage http://couchdb.apache.org/ CouchDB: The Definitive Guide http://books.couchdb.org/relax/ Damien Katz Relaxing on CouchDB CouchDB에 대해 Damien Katz(CouchDB를 만든)와 인터뷰한 내용. http://www.infoq.com/interviews/CouchDB-Damien-Katz 웹 문서들 얼랭으로 구현된 문서 기반 분산 데이터베이스, CouchDB http://www.dbguide.net/know/know102001.jsp?mode=view&pg=1&idx=3468 문서기반 분산 데이터베이스 CouchDB http://xeraph.egloos...

backend/DataBase 2010.02.09

테스트 코드 작성 관련 링크

JUnit Test Case JUnit 을 이용하여 Unit Test Case 를 작성하고 실행하는 방법을 안내한다. http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev:tst:test_case DB support 데이터베이스 관련 단위 테스트를 수행하기 위한 Test Case 를 작성하고 실행하는 방법을 안내한다. http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev:tst:db_support How to test spring session or request scope beans http://thomaswabner.wordpress.com/2009/04/27/how-to-test-spr..

backend 2010.02.08

throw new UnsupportedOperationException()

자동생성되는 메소드에 throw new UnsupportedOperationException()넣기 이클립스에서 제공해주는 코드 템플릿을 이용하여, 인터페이스를 만들고 그 구현체를 퀵픽스를 통해 메소드를 자동생성했을 때 리턴값이 있을 경우 컴파일에러가 일시적으로 나지 않게 해주기 위해서 return null; 이나 return 0; 이나 임시땜빵으로 이런작업을 해주는데 이게 귀찮을 때 throw new UnsupportedOperationException()을 코드 템플릿을 이용하여 넣어주는 방법 이클립스라면 Preference – Java – Code Style – Code Templates 안에 Code/Method Body에 이를 추가해주면 된다. 자꾸 까먹어서, 링크 해 둡니다.

backend/Java 2009.10.30 (4)

[Effective Java] 23. 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자.

[Effective Java] 23. 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자. 제네릭을 사용하면 각 컬렉션에 어떤 타입의 객체를 허용할 것인지 컴파일러에게 알려주게 되며, 캐스트 코드를 컴파일러가 자동으로 만들어준다. 또한 잘못된 타입의 객체를 추가하려고 하면 컴파일 시에 알려준다. 하나 이상의 타입 매개변수(type parameter)를 선언하고 있는 클래스나 인터페이스를 제네릭 클래스, 또는 제네릭 인터페이스라고 한다. 자바 1.5를 기준으로 List 인터페이스에는 하나의 타입 매개변수로 E가 있는데, 여기서 E는 List에 저장되는 요소의 타입을 나타낸다. 각 제네릭 타입에서는 원천(raw) 타입을 정의하는데 원천 타입이란 실 타입 매개변수가 없이 사용되는 제네릭 타입의 이름을..

backend/Java 2009.10.30

[Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자.

[Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자. // Constant interface antipattern - do not use! public interface PhysicalConstants { // Avogadro's number (1/mol) static final double AVOGADROS_NUMBER = 6.02214199e23; // Boltzmann constant (J/K) static final double BOLTZMANN_CONSTANT = 1.3806503e-23; // Mass of the electron (kg) static final double ELECTRON_MASS = 9.10938188e-31; } 상수 인터페이스 패턴은 인터페이스..

backend/Java 2009.10.27 (2)

[Effective Java] 15. 가변성을 최소화하자.

[Effective Java] 15. 가변성을 최소화하자. 불변(immutable) 클래스는 자신의 인스턴스가 갖는 값을 변경할 수 없는 클래스이다. 각 인스턴스가 갖는 모든 정보는 그것이 생성될 때 제공되며 객체로 살아있는동안 변경되지 않는다. 자바의 불변 클래스는 String, 박스화 기본형(boxed primitive) 클래스, BigInteger, BigDecimal 등등이 있다. 불변 클래스는 가변 클래스에 비해 설계와 구현 및 사용이 더 쉽다. 또한 에러 발생이 적으며 보안이나 사용 측변에서 더 안전하다. 불변 클래스 만들때 다섯 가지 규칙 1) 객체의 상태를 변경하는 그 어떤 메소드(변경자라고 하는)도 제공하지 않는다. 2) 상속을 할 수 없도록 하자. 일반적으로는 클래스를 final로 지정..

backend/Java 2009.10.19 (2)