분류 전체보기 45

Chapter 12. 예외 처리

🏷 예외와 예외 클래스 컴퓨터 하드 웨어 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 에러라고 한다. 자바에서는 에러 이외에 예외라고 부르는 오류가 있다. 예외란 ..? 잘못된 사용 또는 코딩으로 인한 오류를 말한다. 예외가 발생하면 프로그램은 곧바로 종료된다는 점에서 에러와 동일하지만, 예외 처리를 통해 계속 실행 상태를 유지할 수 있다. ✔️ 예외의 종류 일반 예외 (Exception) 컴파일러가 예외 처리 코드 여부를 검사하는 예외를 말한다. 실행 예외 (Runtime Exception) 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외를 말한다. 자바는 예외가 발생하면 예외 클래스로부터 객체를 생성한다. 이 객체는 예외 처리 시 사용된다. 자바의 모든 에러와 예외 클래스는 ..

Querydsl | Pageable과 page를 사용하는 방법

SpringData에서 Pageable은 페이지 요청에 대한 데이터를 담을때 사용하는 인터페이스이다. 본론으로 들어가기 전에 위의 인터페이스에 대해 잠시 살펴보자!! 위의 사진과 같이 페이징 처리에 필요한 (limit, offset) 등을 구현하기 위한 메소드들이 정의되어 있으며, pageable의 구현체인 AbstractPageRequest 클래스에 구현되어 있다. pageable을 사용하기 위해서는 Controller 단에서 pageable 파라미터를 받으면 Spring MVC에서 pageable 사용을 지원하기 때문에 자체적으로 PageableHandlerMethodArgumentResolver 클래스를 사용하여 pageable 인스턴스를 구현체인 PageRequest로 변환한다. 그래서 reque..

JPA | QueryDsl 집계함수[SUM, COUNT ..] 사용 시, Dto로 반환

✅ 고민되었던 부분 querydsl 에서 집계함수를 사용하게 되면 반환값이 Tuple 형식으로 반환되게 된다. Tuple 형식을 사용해보려고 했지만 반환되는 값에서 필드 하나하나를 가져와 다시 dto에 맵핑해야 하는 상황이 발생되었고, Tuple 자체가 querydsl 객체이기 때문에 Repository 계층이 아닌, Service 계층까지 가져오는 것을 막고 싶었다. 위의 방법을 찾아보다가 집계함수 사용 시, groupby와 projection을 사용하여 dto로 받아올 수 있다는 사실을 알게 되었고, projection에 대하여 공부해보고, 사용 방법에 대해서도 적어보려고 한다! ✅ Projection 연산자란 ..? 한 Relation의 Attribute들의 부분 집합을 구성하는 연산자이다. 결과로..

Chapter 09. 중첩 선언과 익명 객체

🏷 중첩 클래스 객체 지향 프로그램에서는 클래스 간에 서로 긴밀한 관계를 맺고 상호작용한다. 클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스만 관계를 맺는 경우에는 중첩 클래스로 선언하는 것이 유지보수에도 도움이 되는 경우가 많다. 중첩 클래스란 ? 클래스 내부에 선언한 클래스를 의미한다. 중첩 클래스를 사용하면 클래스의 멤버를 쉽게 사용할 수 있고, 외부에는 중첩 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있다. 선언 위치에 따라 두가지로 분류된다. 멤버 클래스 - 클래스의 멤버로서 선언되는 중첩 클래스 로컬 클래스 - 메소드 내부에서 선언되는 중첩 클래스 중첩 클래스도 하나의 클래스이기 때문에 컴파일하면 바이트코드 파일(.class)가 ..

feign client ErrorDecoder 인터페이스 사용시 마주한 문제 해결기 🙂

위의 해결기를 작성하기 전에 저는 Feign Client를 사용하면서 예외 처리시, ErrorDecoder 인터페이스를 통해서 예외를 처리하고 있다. 정도의 간단한 개념만 잡혀 있는 상태였다. 👉🏻 내가 마주한 문제 프로젝트에서 특정 주소에 대한 위, 경도 값을 알기 위해서 카카오 개발자 센터에서 제공하는 지도 Rest-Api 통신을 개발하였고, 통신을 위한 클라이언트는 Feign Client 를 사용하게 되었다. 정상 응답값에 대한 처리는 완료하였고, 예외에 대한 처리를 진행하고자 하였다. 예를들어, 카카오 API에서는 클라이언트 Error로 HttpSatus를 400, 401로 내려주고 있었으며, 클라이언트 에러의 예시는 파라미터 정보를 보내지 않았거나, API Key 등을 잘못 보냈을 경우로 보고 ..

[ feign client ] 사용 시, 응답값 형식 오류

지도를 그리기 위해서는 위, 경도 값이 필요하여 카카오 지도 API를 사용하게 되었다. 앞선 포스팅에서 어떠한 클라이언트 툴을 사용할지 고민하던 중에 feign 의 장점이 크다고 생각하여 feign-client를 적용하였다. 내가 사용한 카카오 지도 API의 응답 값은 아래와 같았다. ex) { "meta": { "total_count": 4, "pageable_count": 4, "is_end": true }, "documents": [ { "address_name": "전북 익산시 부송동 100", "y": "35.97664845766847", "x": "126.99597295767953", "address_type": "REGION_ADDR", "address": { "address_name": "..

Chapter 08. 인터페이스

🏷 인터페이스 역할 인터페이스는 사전적인 의미로 두 장치를 연결하는 접속기를 말한다. 여기서 두 장치를 서로 다른 객체로 본다면, 인터페이스는 이 두 객체를 연결하는 역할을 한다. 아래 그림과 같이 객체 A는 인터페이스를 통해 객체 B를 사용할 수 있다. 객체 A가 인터페이스의 메소드를 호출하면, 인터페이스는 객체 B의 메소드를 호출하고, 그 결과를 받아 객체 A로 전달해준다. 객체 A가 객체 B의 메소드를 직접 호출하면 간단할텐데 왜 중간에 인터페이스를 거치도록 하는걸까? 만약, 객체 B가 객체 C로 변경이 된다고 가정해보자 객체 A는 인터페이스 메소드만 사용하므로 객체 B가 객체 C로 변경되는 것에는 관심이 없다. 만약 인터페이스가 없다면 객체 A의 소스 코드를 객체 B에서 객체 C로 변경하는 작업이..

마이크로서비스에서 서비스간 통신 방법 차이

🤔 의문점 토이프로젝트를 진행하면서 서버 간 통신을 위해 RestTemplate과 Feign-Client 의 방식 중 어떤 방식을 선택하는게 좋을까에 대한 의문이 들었다. 실무에서는 두 방식을 모두 사용하지만, 두 방식에 대한 차이점을 정확히 인지하지 않고 어떤 프로젝트에서는 FeignClient 을 사용하고 있으면 동일하게 따라가고 어떤 프로젝트에서 RestTemplate를 사용하면 동일하게 따라가는 방식으로 코딩을 해왔던 것 같다. 아무래도 서비스 회사다 보니, 프로젝트를 처음부터 시작할 기회는 거의 없고 기존에 생성되어 있는 프로젝트에서 API를 추가가 대부분이어서 각각의 방식에 대해서는 인지하고 있었지만 어떤걸 택하면 좋을까? 라는 의문점은 들지 않았던 것 같다. 그래서 이번을 계기로 이 두 방식..

Chapter 07. 상속

🏷 상속 개념 상속은 부모가 자식에게 물려주는 행위를 말한다. 객체 지향 프로그램에서도 부모 클래스의 필드와 메소드를 자식 클래스에게 물려줄 수 있다. 상속의 장점 ! 상속은 이미 잘 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여 시간을 단축할 수 있다. public class A { int field1; void method1() { ... } } public class B extends A { // A 클래스 상속 String field1; void method2() { ... } } // A로부터 물려받은 필드와 메소드 B b = new B(); b.field1 = 10; b.methdo1(); // B가 추가한 필드와 메소드 b.filed2 = "홍길동"; meth..

GeneratedType - 기본키 저장 전략 4가지

🏷 IDENTITY 전략 mysql에서 사용 기본키 생성을 데이터베이스에 위임한다. em.persist() 로 객체를 영속화 하는 시점에 insert query 가 db에 전송되고 여기서 반환되는 식별자 값을 가지고 1차 캐시에 저장한다. ❓em.persist() 에 대해서 좀 더 알아보자 보통 객체 생성 후, em.persist(Person) 을 사용하게 되면, 영속 상태 즉, 1차 캐시에 저장되게 된다. 이후, commit() 을 하기 전까지는, 쓰기 지연 sql 저장소에 보관되어 있다가, commit() 이 되면, 엔티티 매니저는 영속성 컨텍스트를 flush() 하게 된다. ✔️ 영속성 컨텍스트의 flush() 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 작업으로, 이때 등록, 수정, ..