개발/java
-
Exception 분리개발/java 2024. 8. 19. 16:43
고객사이드오류가 발생할 경우 Exception을 처리를 보통 하는데 이 경우 고객에게 500에러를 보여줄 수는 없다 1.HttpStatusCode를 변경하고 errorMessage에 고객 사이드에서 발생 시킬 오류를 전달한다 시스템사이드 시스템 내부에서는 빠른 에러 감지를 위해 어떤 에러가 발생했는지 파악을 쉽게 해야한다 그러기 위해 Exception을 분리를 하는게 좋다 예를 들어 APIException , SystemException , MessageException 과 같은 방식이다 그 후 각 서비스 별로 Exception을 호출 하며 ExceptionHandler를 통해 Exception 별 log를 출력한다
-
RESTAPI 이력감지개발/java 2024. 8. 19. 16:33
상황하나의 서비스 내에 여러 api가 호출이 되고 있다. 조건서비스의 공통 키를 기준으로 api 이력을 조회가 가능하게 파이프를 묶는다 방법 1.RequestBodyAdviceAdapter를 통해 Controller의 parameter를 읽어 공통 키를 ThreadLocal에 등록한다 2.RestTemplete을 config에 추가하고 interceptor를 처리할 class를 등록한다. 3.interceptor의 경우 httpStatusCode를 통해 동작을 하는게 일반적인데 공통의 Model이 있다면 변경하여 사용한다. 4.필요한 사항들을 HttpRequest request을 통해 받아서 DB 적재 한다 5.작업이 완료가 되면 ThreadLocal을 clear한다 cf) spring의 경우 ..
-
map vs flatmap개발/java 2022. 1. 4. 02:08
오늘은 stream 연산자 중 둘의 차이점에 대해 살펴보겠습니다. 리스트 내 개별 항목들을 특정 형식으로 변경하려고 할때 map을 주로 사용합니다. 그러나 이 맵이 이중으로 쌓여져 있다면 ??? distinct 처리를 해야한다면 ?? map을 통해서 할수가 없습니다. 좀 더 예시를 들어보겠습니다. 가정 : 주문을 할때 배송지휴대폰 번호를 주문자 번호가 아닌 부모님 번호로 주문을 했고 부모님과 주문자 모두가 해당 사이트에 가입이 되어있다고 가정해보겠습니다. 이력조회 프로그램 설명 1.배송지이력 내 휴대폰번호를 넣어 고객번호 리스트를 추출합니다. 2.추출된 고객번호 리스트에 있는 고객번호 들을 고객 정보 조회 메서드에 전달하여 고객정보리스트를 가져옵니다. 문제점 : 고객정보조회 메서드에서 정보리스트를 가져 ..
-
익명클래스 실용편개발/java 2022. 1. 1. 16:12
익명클래스를 실제로 한번 사용해보겠습니다. 배경부터 설명하겠습니다. 사과 농장이 있습니다. 사과 농장에서 사과는 초록색과 , 빨간색 사과가 있습니다. 이를 분류하여 색마다 갯수를 추출하고 싶어서 의뢰를 한 내용입니다. 현재 농장에서 재배한 사과는 3개밖에 없으며 리스트에는 초록사과 2개 ,빨강사과 1개로 정의하겠습니다. List Apples() { List apples = new ArrayList(); apples.add(new Apple(Color.GREEN.name())); apples.add(new Apple(Color.GREEN.name())); apples.add(new Apple(Color.RED.name())); return apples; } 작업 순서는 아래와 같으며 각각에 대한 코드를 설..
-
익명클래스개발/java 2022. 1. 1. 15:33
익명클래스는 이름 그대로 이름이 없는 클래스입니다. 사용하는 이유에 대해서 알려드리자면 부모 클래스를 사용하는 자식이 1회성에 그치거나 혹은 너무 무분별한 자식이 생길 경우 이를 익명 클래스를 이용해서 Override하여 사용할 수 있습니다. 예를 들어보겠습니다. 이런 부모 클래스가 있습니다. 이 메서드를 재활용하기 위해서는 일반적으로는 Person을 상속받는 자식 클래스를 만들고 거기에 구현부를 Override해서 작성해야합니다. public class Person { public void whoAmI() { System.out.println("나는 사람이다."); } } public class Child extends Person { @Override public void whoAmI() { Syst..
-
stream vs parallelStream개발/java 2021. 12. 30. 23:01
자바8 에서는 데이터 리스트를 스트림을 통해 계산을 할 수 있습니다. 그런데 이중 parallelStream이라는 것도 같이 제공을 하고 있습니다. 단어의 의미만봐도 알수 있는데 병렬처리를 할 수 잇는 스트림입니다. 예를 들어 과일 중 사과만 추출하는 기능을 스트림을 통해 리스트를 받아온다고 가정을 해보겠습니다. 1.스트림이용 fruits.stream().filter( fruit -> "apple".equals(fruit.getName())).collect(Collectors.toList()); 그럴때 parallelStream을 이용하면 추출의 기능을 CPU가 분할하여 수행을 하며 추후 이를 특정 CPU에서 합산하여 데이터를 추출합니다. 2.페러럴스트림이용 fruits.parallelStream().f..
-
초기화블록개발/java 2021. 12. 25. 17:30
초기화 블록은 클래스가 생성될때 무조건 수행되는 블록입니다. 종류에는 클래스 초기화블록 , 인스턴스 초기화 블록이 있습니다. 이름에서도 알수 있는듯이 클래스 초기화 블록은 클래스 호출 시 한번 , 인스턴스 초기화 블록은 인스턴스 생성시 마다 수행됩니다. 또한 클래스 초기화 블록은 static을 이용하기에 static 초기화 변수라고 이름을 나타내기도 합니다. 예를 보겠습니다. 방문시 방문수를 출력하는 클래스 입니다. public class Visit { int people; static { System.out.print("클래스 초기화변수로 방문하였습니다."); } { System.out.print("인스턴스 초기화변수로 방문하였습니다."); } public Visit() { System.out.prin..
-
Builder 패턴 활용기개발/java 2021. 12. 25. 16:37
엔티티를 통해 Request 객체를 상속받는다고 가정을 하겠습니다. 그리고 Request 객체는 엔티티 이외의 요소가 필요하다고 가정을 하겠습니다. 이 경우 Request 객체는 부모인 엔티티 객체에 대한 정보가 필요합니다. Request를 사용할 때 단순 부모 클래스에 setter getter를 두어 변수로 받아 올 수 있지만 이는 불변 객체를 위반합니다. 그러므로 Builder 패턴으로 작성을 하는게 일반적으로 맞다고 생각합니다. 그러나 Builder패턴을 사용할 경우 클래스 상단에 Builder 애노테이션을 넣는다고 해서 부모 클래스를 받아올 수 있는 것이 아닙니다. 방법은 1.부모 클래스에 @AllArgsConstructor 애노테이션을 추가하여 모든 변수를 가진 생성자를 추가 합니다. 2.자식 ..