728x90
반응형

Java 88

Collection Test, Fail Fast, Fail Safe...

오늘은 기본적인 Collection 들에 대해 간단한 테스트를 해 볼 예정이다. 그동안 아무런 생각없이 사용해 왔는데 어떻게 다른지에 대해 테스트 코드를 통해 알아보자. 우선 간단한 ArrayList를 while 문으로 돌려보자. @Test public void loopTest() { Collection collection = new ArrayList(); collection.add("1"); collection.add("2"); collection.add("3"); collection.add("4"); collection.add("5"); Iterator iterator = collection.iterator(); int i = 0; while (iterator.hasNext()) { log.debug..

Java 2021.07.02

Public Interface의 품질에 영향을 미치는 요소...

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791158391409&orderClick=LET&Kc= 오브젝트 - 교보문고 코드로 이해하는 객체지향 설계 | 객체지향으로 향하는 첫걸음은 클래스가 아니라 객체를 바라보는 것에서부터 시작한다. 객체지향으로 향하는 두번째 걸음은 객체를 독립적인 존재가 아니라 www.kyobobook.co.kr 위 책 6장에 나오는 내용을 정리해 둔다. 182면에 Public Interface의 품질에 영향을 미치는 기법에 대해 나온다. 1. 디미터 법칙 디미터 법칙(Law of Demeter)은 객체의 내부 구조에 강하게 결합되지 않도록 협력 경로를 제한하라는 것. "낯선 ..

Java 2021.07.01

Reflection 사용2

Reflection이란 무엇인지, 그리고 기본적으로 어떻게 접근 가능한지 아래의 포스팅에서 다루었다. 2021.06.25 - [Java] - Reflection Reflection 리플렉션에 대해 정확하게 무엇이다라고 정의 내리기가 쉽지 않다. 명확하게 캡슐화를 하여 접근하지 못하도록 정의 된 생성자를 포함하여 멤버변수라던가 메소드에 접근 가능하도록 해 주는 www.4te.co.kr 2021.06.25 - [Java] - Reflection 사용1 Reflection 사용1 2021.06.25 - [Java] - Reflection 에서 Reflection 이란 무엇인지, 그리고 왜 사용하는지, 어디에서 사용 되는지 등을 확인해 봤다. 이번 포스트에서는 실제로 Reflection을 직접 사용해 보고 어떻..

Java 2021.06.29

Reflection 사용1

2021.06.25 - [Java] - Reflection 에서 Reflection 이란 무엇인지, 그리고 왜 사용하는지, 어디에서 사용 되는지 등을 확인해 봤다. 이번 포스트에서는 실제로 Reflection을 직접 사용해 보고 어떻게 동작하는지 확인해 보자. 먼저 테스트를 위한 Class를 작성하자. package com.example.demo.reflection; public class A { private String ps1 = "aaa"; private String ps2; public String ps3; private A() { System.out.println("this is empty arg constructor"); } private A(String ps2) { this.ps2 = ps2..

Java 2021.06.25

Reflection

리플렉션에 대해 정확하게 무엇이다라고 정의 내리기가 쉽지 않다. 명확하게 캡슐화를 하여 접근하지 못하도록 정의 된 생성자를 포함하여 멤버변수라던가 메소드에 접근 가능하도록 해 주는 기능이라고 정의하면 될려나 모르겠다. 원래는 접근하지 못하는 코드에 어떻게 접근하는 것일까? Reflection 이란 말 처럼 Heap 메모리에 올라간 Instance를 투영하여 실제 Class가 어떻게 생겼는지 확인하는 방법으로 접근한다고 한다. 내부적으로 정확하게 어떻게 구현 되어 있는지 알 수 없지만 ^^ 그런데 이러한 기능은 코드를 통해 접근하지 못하도록 의도를 가지고 만든 코드를 오히려 망치는 기능일수도 있는데 왜 존재하는 것일까? Reflection이 사용된 대표적인 코드는 바로 Spring Framework의 DI..

Java 2021.06.25

Rest API Versioning

https://www.springboottutorial.com/spring-boot-versioning-for-rest-services 참조 URL Path 방식, Param 방식, Header 방식, Media type versioning 등이 있음. 개인적으로 Header 방식 선호. 다음과 같은 방식으로 처리 @GetMapping(value = "/student/header", headers = "X-API-VERSION=1") public StudentV1 headerV1() { return new StudentV1("Bob Charlie"); } @GetMapping(value = "/student/header", headers = "X-API-VERSION=2") public StudentV2..

Java/Spring 2021.06.16

Java Random 함수의 동작 원리

회사 내 스터디에서 다음의 책을 가지고 하고 있는데 쉬운 내용이지만 중간 중간 알게 되는 흥미로운 내용이 있어서 기록한다. http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&barcode=9791163030072 Do it! 자료구조와 함께 배우는 알고리즘 입문: 자바 편 - 교보문고 엄선된 88개의 실습 예제와 93개의 연습 문제! | IT 기업 시험, 면접 필수 역량인자료구조와 알고리즘의 기초를 100% 담아낸 책!IT 기업 코딩 면접, 필기 시험에서 당황하지 않으려면?눈으로 읽고 손 www.kyobobook.co.kr 일단 알게 된 내용은 2장에 나오는 Random 함수이며 Random 함수는 진짜 랜덤이 아니라는 것이다. 코드 내에서 ..

Java 2021.05.14

간단한 Flux method 테스트 (Reactive WebFlux) 3

2021.04.02 - [Java/Reactive] - 간단한 Flux method 테스트 (Reactive WebFlux) 2 간단한 Flux method 테스트 (Reactive WebFlux) 2 2021.03.26 - [Java/Reactive] - 간단한 Flux method 테스트 (Reactive WebFlux) 위 글이 길어져서 새롭게 포스팅을 더 작성한다. usingTest 일회성 리소스에 의존하는 스트림을 만들 때 using 메소드를 사용한다... www.4te.co.kr 위의 글이 길어져 추가로 작성한다. 마지막에 context가 불변객체로 작성 되며, Context0 ~ Context5, ContextN과 같이 만들어져 있다고 하였는데 이와 관련하여 책에서 아래와 같이 테스트 한 코..

Java/Reactive 2021.04.12

Flux Test 중 희한한 현상

github.com/wikibook/spring5-reactive/blob/master/chapter-04/src/test/java/org/rpis5/chapters/chapter_04/ReactorEssentialsTest.java wikibook/spring5-reactive 『실전! 스프링 5를 활용한 리액티브 프로그래밍』 예제 코드. Contribute to wikibook/spring5-reactive development by creating an account on GitHub. github.com 위에 나와 있는 usingWhenExample 내용을 테스트 도중 희한한 현상을 겪게 되어 기록. 테스트 하고자 하는 소스는 368번째 라인에 있는 Transaction 클래스이며, 해당 클래스의..

Java/Reactive 2021.04.05

간단한 Flux method 테스트 (Reactive WebFlux) 2

2021.03.26 - [Java/Reactive] - 간단한 Flux method 테스트 (Reactive WebFlux) 위 글이 길어져서 새롭게 포스팅을 더 작성한다. usingTest 일회성 리소스에 의존하는 스트림을 만들 때 using 메소드를 사용한다. 일반적인 try-with-resources 와 비슷한 방식이다. package com.example.demo.flux; import lombok.extern.slf4j.Slf4j; import java.util.Arrays; import java.util.Random; @Slf4j public class UsingConnection implements AutoCloseable { private final Random rnd = new Rando..

Java/Reactive 2021.04.02

JUnit Test Code에서 Slf4j logger 이용하기

그 동안 JUnitTest Code에서 @Slf4j 어노테이션을 이용해 로거를 사용하려 하면 다음과 같은 오류가 발생 했었다. 그냥 무슨 이유가 있는가 보다 하고 그냥 System.out.println을 사용 하였는데, 갑자기 궁금함에 검색해 보니 stackoverflow 에 이미 답이 있더라. stackoverflow.com/questions/29076981/how-to-intercept-slf4j-with-logback-logging-via-a-junit-test How to intercept SLF4J (with logback) logging via a JUnit test? Is it possible to somehow intercept the logging (SLF4J + logback) and ..

Java/Spring 2021.04.01

간단한 Flux method 테스트 (Reactive WebFlux)

Reative의 개념은 간단하지만 실제 사용해보지 않으면 익숙해지기 쉽지 않은 것 같다. 우선은 작은 것 부터 사용해 보고, 하나씩 익숙해지는 시간이 필요한 듯 하여 간단하게 어떻게 동작하는지 확인해 본다. 아래 내용은 "실전! 스프링 5를 활용한 리액티브 프로그래밍"을 따라 하면서 작성한 것이다. - www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791158391591&orderClick=LET&Kc= 실전! 스프링 5를 활용한 리액티브 프로그래밍 - 교보문고 오늘날 기업은 어떤 상황에도 높은 응답성을 유지할 수 있는 새로운 유형의 시스템이 필요합니다. 리액티브 프로그래밍을 이용하면 이를 달성할 수 있습니다. 이러..

Java/Reactive 2021.03.26

모든 소프트웨어 개발자가 알아야 할 디자인 패턴2

참고용 사이트 jistol.github.io/software%20engineering/2018/04/11/observer-pubsub-pattern/ Observer 패턴과 Publisher/Subscriber(Pub-Sub) 패턴의 차이점 jistol.github.io victorydntmd.tistory.com/292 [디자인패턴] 전략 패턴 ( Strategy Pattern ) 전략 패턴 ( Strategy Pattern ) 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 victorydntmd.tistory.com jusungpark.tistory.com/23 디자인패턴 - 퍼사드 패턴 (..

Java 2021.03.15

모든 소프트웨어 개발자가 알아야 할 디자인 패턴

이 글은 viveknaskar.medium.com/design-patterns-that-every-software-developer-must-know-ac71f575e68 에 나와 있는 내용을 정리한 글입니다. 참고로 번역은 아니며 개발자의 의사소통 수단인 코드만 보고서 제가 임의로 적은 글입니다. Singleton Pattern 싱글톤 패턴은 인스턴스가 1개만 생성되도록 하는 것입니다. Spring 자체가 Bean으로 등록될 시 자체적으로 인스턴스를 1개만 생성 하기 때문에 싱글톤 패턴을 쓰고 있는 것이지만, 코드 상으로는 어떻게 구현 하는 것인지 아래의 예제에서 볼 수 있습니다. /** * Singleton is a design pattern by which you create a singleton ..

Java 2021.03.12

Hash에 Salt 치기

Hash란 무엇인가? 영어 단어를 찾아 보면 "고기와 감자를 잘게 다져 섞어 요리하여 따뜻하게 차려 낸 것" 이라고 나온다. 무엇인가를 잘게 잘라내는 것을 말하는 것으로 보인다. 우리가 프로그램을 개발하면서 이 단어를 볼 수 있는 곳은 HashMap 에서 주로 볼 것이다. 또한 암호화와 관련되어서 Hash를 하는 경우도 있다. 무엇이 되었던 어떠한 값을 잘게 쪼개어 겹치지 않도록 나눈다는 뉘앙스를 준다. 오늘 다루고자 하는 것은 특정한 값을 Hash하여 고유한 값을 가지는 특정 문자열로 바꿔주는 것을 다루고자 한다. 우리가 자주 사용하는 Hash에는 MD5, SHA1, SHA256, 512 등이 있다. MD5를 예를 들어 사용해 보면 아래와 같이 나오게 된다. ( www.baeldung.com/java-..

Java 2021.03.11

Exception을 활용하여 클린코드 작성하기

클린코드 책을 읽다 보면 '오류코드 보다는 예외를 사용하라'라는 말이 나온다. 코드로 분기를 치면서 특정 상황에 특정 처리를 해야 하는 코드보다 예외를 던져서 처리하는 것이 한 눈에 볼 수있도록 코드 가독성을 올려준다는 말이다. 따라서 현재 실무에서 처리하고 있는 코드를 예를 들어 보여 줌으로 어떻게 깔끔한 코드를 사용할 수 있는지 살펴보자. 현재 사용하고 있는 코드에서는 다음과 같은 interface를 우선 선언하였다. package com.kst.macaront.common.lib.exception; import org.springframework.http.HttpStatus; public interface ApiException { HttpStatus getHttpStatus(); String ge..

Java/Spring 2021.03.11

추상클래스와 인터페이스의 차이

추상 클래스와 인터페이스의 차이점에 대해 표로 정리해 본다. 추상클래스 인터페이스 비고 정의 클래스 내 '추상메소드'가 하나 이상 포함되어 있거나 abstract로 정의된 경우 모든 메소드가 추상 메소드인 경우 목적 상속을 받아 기능을 이용하고 확장 하는 것 함수의 구현을 강제하기 위함. 이로 인해 구현 객체의 같은 동작을 보장 함. 상속, 구현 다중 상속 지원하지 않아 1개만 상속 구현이라서 여러개의 인터페이스를 구현할 수 있음 구상 메소드 구상 메소드가 존재할 수 있다. 구상 메소드 자체가 있을 수 없다. 생성자 생성자를 가질 수 있다. 생성자를 가질 수 없다. 변수 일반 변수를 가질 수 있다. 상수만 가질 수 있다. 예제 도형 package com.example.demo.abst; public ab..

Java 2021.02.08

Intellij에서 "could not autowire. no beans of" 에러가 나오는 경우

Intellij 에서 Autowired annotation을 사용하면서 그동안 나지 않던 "could not autowire. no beans of" 에러가 발생하였다. 정확한 원인을 몰라 구글링 하였지만 ComponentScan을 지정하라는 등, intellij 에러 검출 옵션을 수정하라는 등 여러가지 내용이 있었지만 정확한 해결 방법은 아니였다. 이런 저런 방법을 사용하다가 해결하게 된 내용을 기술한다. 1. 먼저 import 부분을 살펴 보았다. 문제가 되었을 때의 패키지 구조는 아래와 같았다. SQSController에서 SQSClient를 Autowired 하는 것이였는데 빨간 밑줄이 가면서 오류를 내뱉고 있었다. 하지만 그와 상관 없이 빌드 및 실행은 잘 되고 있는 상태 강제로 import를 ..

Java 기본 내용을 위한 북마크

Memory, GC yaboong.github.io/java/2018/05/26/java-memory-management/ 자바 메모리 관리 - 스택 & 힙 개요 Java 에서 메모리 관리는 어떻게 이루어지는지 알아보기 위함. Stack 과 Heap 영역 각 역할에 대해 알아본다. 간단한 코드예제와 함께 실제 코드에서 어떻게 Stack 과 Heap 영역이 사용되는지 살펴 yaboong.github.io yaboong.github.io/java/2018/06/09/java-garbage-collection/ 자바 메모리 관리 - 가비지 컬렉션 개요 Java 가비지 컬렉션에 대해서 공부한 내용을 정리해본다. Java 에서 메모리 관리는 어떻게 이루어지는지 이해하고 있으면 좋다. 자바 메모리 관리 - 스택 &..

Java 2021.01.28

Reative 관련 북마크

www.reactivemanifesto.org/ko 리액티브 선언문 탄력성(Resilient): 시스템이 장애 에 직면하더라도 응답성을 유지 하는 것을 탄력성이 있다고 합니다. 탄력성은 고가용성 시스템, 미션 크리티컬 시스템에만 적용되지 않습니다. 탄력성이 없는 시 www.reactivemanifesto.org woowabros.github.io/experience/2019/03/18/tech-toby-reactive.html 3월 우아한 Tech 세미나 후기 - 우아한형제들 기술 블로그 스프링 리액티브 세미나 후기 woowabros.github.io devahea.github.io/2019/04/21/Spring-WebFlux%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%A..

Java/Reactive 2021.01.27

명시적인 instance-id 셋팅으로 instance 샤딩하기

2021/01/22 - [Java/Spring] - SQS와 SSE를 이용한 Proxy 서버 만들기 위 글에서 SQS를 Listen 하는 과정에서 Parrparallel 하게 EC2 인스턴스가 생성되게 되면 어느 쪽에서 Queue item을 consume 하게 되는지 알 수 없어서 접속해 있는 고객용 앱에 Event를 내려줄 수 없는 상황에 직면하게 된다. 이를 해결하기 위해 명시적인 샤딩 및 고객번호를 통해 특정 서버로 접속할 수 있도록 분기를 쳐야 하는데, 이렇게 하기 위해서는 일단 Eureka에 등록되는 instance-id를 필요에 맞게 설정하고, consume을 할 수 있는 queue name도 설정해야 한다. 보통 1개의 yml 파일에서 셋팅을 하게 될 경우 동적으로 값을 바꿔 가며 올릴 수 ..

Java/Spring 2021.01.25

SQS와 SSE를 이용한 Proxy 서버 만들기

기사용앱에서 특정 데이터를 승객용 앱에 내려주기 위해서 Server에서 정보를 Proxy 해 주어야 하는데 이와 관련하여 기사용 앱에서 내용을 올려주는 거야 단순히 API 하나를 호출하면 끝나지만, 승객용 앱 입장에서는 언제 내용이 변경되는지 알 수 없어서 고민하던 차에 SQS와 SSE를 사용해서 prototype을 만들어 봤다. 물론 승객용 앱에서 주기적으로 Polling 해서 만들 수도 있지만 조금 더 좋은 방법이 무엇인지 고민하면서 개발을 하게 되었다. 아직 오픈이 안된 상태이므로 잘못된 소스일 수도 있다. 간단한 구조는 아래와 같다. 일단 SQS는 AWS를 쓴다는 입장에서 사용할 수 있는 간단한 Queue 다. 기사용 App에서 특정 API를 호출하게 되면 해당 내용을 SQS에 담는다. @Slf4..

Java/Spring 2021.01.22

Asynchronous Methods 만들기

본 내용은 spring.io/guides/gs/async-method/ 를 참고하여 작성한다. CompletableFuture가 어떻게 동작하는지 확인한다. 코드가 동작하는 시나리오는 https://api.github.com/users/{user} API를 호출하여 그 결과를 보여주는 것이다. 동시에 3개의 API를 호출하게 될 경우 sync로 받게 될 경우 1개의 API 당 1초가 걸리게 될 경우 3초 + Alpha의 시간이 걸릴 것인데 결과는 어떻게 나오게 될지 확인해 본다. 먼저 값을 담아 올 User 객체를 만든다. 참고로 Api Response는 다음과 같다. { "login": "pivotalsoftware", "id": 4247270, "node_id": "MDEyOk9yZ2FuaXphdGl..

Java/Spring 2021.01.14

API 호출 테스트를 위한 간단한 팁

api 호출을 할 경우 일부러 타임아웃 Exception과 같은 상황을 만들어서 테스트 하는 경우가 있다. 이럴 경우 Target API에 일부러 Sleep을 주어 상황을 만들어서 작업을 하였는데 그렇게 할 필요가 없다. spring.io/guides/gs/gateway/를 보면서 Srping Cloud Gateway를 구축하고 있는데 예제로 사용되어지는 httpbin.org 이라는 사이트를 이용하면 된다. 가령 간단하게 3초 딜레이 되는 경우를 테스트 하고 싶다면 http://httpbin.org/delay/3 이라고 호출하면 된다. 전체적인 내용은 swagger로 정리되어져 있기 때문에 http://httpbin.org 메인을 참고하면 된다. httpbin.org A simple HTTP Reques..

Java/Spring 2020.12.21

AttributeConverter class registered multiple times 에러가 발생할 경우

다른 사람이 Push 해 둔 소스를 Pull 받아 Springboot를 실행하는데 "AttributeConverter class registered multiple times" 에러가 뜨면서 실행이 되지 않았다. 관련된 에러가 Entity의 Converter 부분이여서 Database 연동 문제인줄 알고 intellij에서 Database source를 연결하였지만 실패... 구글링 해 보니 해당 Converter가 여러 곳에서 사용되면 그런 문제가 발생된다는 답이 몇 개 보여 converter를 사용 하는 곳을 다 주석 처리해 봐도 안되서 실패... 결국 로컬 Git repository 삭제 후 다시 Clone 받아서 실행해 보니 성공 함.

Java/Spring 2020.12.16

테스트 코드 작성 시 willReturn 값이 안나오는 경우

오랜만에 테스트 코드를 작성하기 위해 구글링 해서 작성을 했는데 내가 짜 놓은 시나리오대로 동작을 하지 않아 더 구글링, 그리고 주변에 사람들에게 질문을 하였지만.... 해답은 안 보였다. 작성한 테스트 코드는 아래와 같다. import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springf..

Java/Spring 2020.12.02

Springboot + JPA + JTA (Atomikos) + MySQL 을 이용한 멀티 트랜잭션 구현

두 개의 물리적으로 다른 Database에 트랜잭션을 적용하기 위해서 JTA를 사용해야 한다는 것을 듣고 그 중에 Atomikos를 사용하면 된다는 이야기에 구현을 해 보았다. 구글링을 해 보아도 이런말 저런말들이 많고 예전 기준으로 구현된 것도 많고 소스들이 너무나도 달라 뭘 어떻게 따라 해야 할지 막막했는데... 그리고 주로 MyBatis 기준으로 작업이 되어 있어서 답답한 감이 있었는데 JPA 기준으로 작업을 할 수 있도록 4일 정도 삽질 끝에 완성하여 백업 차원에서 기록으로 남긴다. 먼저 Legacy Database와 새롭게 사용하는 Database가 있다는 가정하에 아래와 같이 작업을 해야 한다. 먼저 사용한 의존성은 아래와 같다. build.gradle dependencies { impleme..

Java/Spring 2019.12.05

멀티 DataSource 접속 방법 정리

한 개의 프로젝트에서 하나의 Database에만 접속하는 경우가 대부분이지만, 2개 이상의 데이터 베이스에 접속하는 경우도 발생하게 된다. 이럴 경우 어떻게 셋팅을 해야 하는지 정리한다. application.yml 설정파일 spring: profiles: active: local application: name: usercms application-local.yml server: port: 9090 spring: profiles: local domain: localhost datasource-a-write: driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://a-db-url:3306/a?autoReconnect=true&useSSL=fals..

Java/Spring 2019.08.13

Spring Batch, Migration, 튜닝 및 OOM 해결 후기

회사에서 진행하는 새로운 프로젝트를 위해서 회원 정보 1,000만건에 가까운 데이터를 마이그레이션 해야 하는 작업이 필요 했다. 회원 정보만 1,000만건이고 기타 회원이 가지고 있는 부가적인 정보들을 포함하자면 거의 1억건에 가까운 데이터로 보여졌는데 이를 어떻게 마이그레이션 해야 하나 고민이 깊었다. 기존 레거시 시스템에서 새로운 시스템으로 이전을 해야 해서 내부적으로 새로운 데이터 베이스 시스템에 맞게 구조를 변경하고 적절한 로직을 가미해서 옮겨야 했기 때문에 단순 데이터 이전은 아니였다. 할줄 아는 거라고는 별로 없으니 Spring Batch를 사용할 수 밖에... 한동안 JPA를 편하게 써 와서 JPA를 사용하고 싶었지만... Bulk Insert가 없어서 저 많은 Insert문을 날리느니 안하..

Java/Spring 2019.08.12
728x90
반응형