System Design
CommonMessageException 정의하기
CommonMessageException 정의하기
2020.11.30CommonMessageException 정의하기 Enum에 OK("1000", "성공") 이런 식으로 정의해놓는건... 분명 좋은 방식이긴 하지만, ```java throw new MyException(dr.getServiceName() + "/" + dr.getCorpName()); ``` 이런 케이스가 커버가 안됨. 특정 메시지나 데이터를 클라이언트 쪽에 내려주고 싶을 때. 다건 업데이트 같은 작업 도중 실패가 발생한 경우, 어느 항목에서 실패가 발생했는지를 클라이언트 쪽에 내려주어야 하는 경우들이 있음. 해결책은? 이런 경우에 사용할 일반적인 Exception을 하나 정의하는 것이 낫다. ```java public class CommonMessageException extends RuntimeEx..
External Client class에서 Exception을 던지는게 좋을까?
External Client class에서 Exception을 던지는게 좋을까?
2020.08.21예시 API 응답으로 수신하는 code 및 그에 따른 반환값 when (response.code) { 1000 -> 성공 (데이터 반환) 1007 -> 기처리 (데이터 반환) 2000 -> 구분해야하는 실패1 2001 -> 구분해야하는 실패2 else -> 그 외 모든 응답 코드(실패) } 예시 상황에서, External Client class에서 Exception을 직접 던지는게 나을까? 아니면 return 기반으로 가는게 나을까? 둘 다 사용하는 hybrid로 가는게 나을까? External Client class에서 Exception을 직접 던지는 경우 예시) 후술하겠지만 이렇게 처리하는 것은 좋지 않다. AbcClient { fun post() { val response = webClient.po..
[Spring] MVC Layered Architecture : Controller와 Service의 책임 나누기
[Spring] MVC Layered Architecture : Controller와 Service의 책임 나누기
2020.07.06그림으로 정리한 Spring MVC Application Architecture 왜 layer가 필요한가? layer를 왜 분리할까? layer를 분리한다는 것에는 어떤 의미가 있는가? layer를 나누게 되면, 다른 layer를 추상화 할 수 있다. 추상화를 잘 했다면, 관심 분리 를 통해 현재 작업하고 있는 layer에 집중할 수 있다. 다른 layer의 모듈을 부품을 갈아끼우듯 변경할 수 있다. 각 layer가 자신의 세부사항을 몰라도 상관 없도록, 잘 추상화해서 제공하고 있었다면 가능하다. 컴포넌트 간의 의존 계층 관계를 깔끔하게 유지할 수 있다. 각 layer를 넘나들면서 스파게티처럼 꼬여 있는 관계가 아니라, 위에서 아래로 떨어지는 간단한 구조 혹은 복잡한 참조는 같은 계층 내에서 끝내는 등 ..
[Spring] MVC Layered Architecture : Map 보다 Data Class 사용해야 하는 이유
[Spring] MVC Layered Architecture : Map 보다 Data Class 사용해야 하는 이유
2020.06.25Map과 data class는 애초에 용도와 목적이 다르다. Map은 data class 처럼 쓸 수는 있지만, 그렇게 쓰는게 Map의 올바른 사용법이라고 할 수는 없다. Data Class 대용으로 Map을 사용할 때의 단점 타입 정보가 유실되어 type safe 하지 않다는 점. 이게 가장 큰 단점이자 본질적인 단점이다. 꺼낼 때 형변환 필요해서 번거롭다. key 지정을 String으로 하다 보니 잘못된 참조에 대한 컴파일 타임 체크가 불가능하다. fragile. 어떤 필드가 어디서 사용되고 있는건지 IDE의 추적 기능 도움을 받을 수 없어 일일히 따라가보아야 한다. 리팩터링이 굉장히 어렵다.=유지보수가 어렵다. (e.g., 이 필드 삭제 해도 되는걸까?) Map을 Domain Model로 쓴다면? ..
[리팩터링 2판] 1장, 2장 - 성능, 경제적인 효과
[리팩터링 2판] 1장, 2장 - 성능, 경제적인 효과
2019.11.18지엽적인 성능 개선에 집착하지 마라 리팩터링 하다 보면, 예를 들어 반복문을 분리면서 같은 인덱스로 반복을 2번 돌게되는 경우 같은, 성능 관점에서 비효율적인 코드를 종종 마주치게 된다. 그 때 읽어보면 좋은 글. 무엇보다도 반복문을 쪼개서 성능이 느려지지 않을까 걱정할 수 있다. 이처럼 반복문이 중복되는 것을 꺼리는 이들이 많지만, 이 정도 중복은 성능에 미치는 영향이 미미할 때가 많다. ... 경험 많은 프로그래머조차 코드의 실제 성능을 정확히 예측하지 못한다. 똑똑한 컴파일러들은 최신 캐싱 기법 등으로 무장하고 있어서 우리의 직관을 초월하는 결과를 내어주기 때문이다. 또한 소프트웨어 성능은 대체로 코드의 몇몇 작은 부분에 의해 결정되므로 그 외의 부분은 수정한다고 해도 성능 차이를 체감할 수 없다...
공통 비즈니스 로직 분리(제휴사 인터페이스 통합 및 클래스 설계)
공통 비즈니스 로직 분리(제휴사 인터페이스 통합 및 클래스 설계)
2019.08.21- 제휴사 API 서버 Npay 서버 연결 작업을 각자 진행한 후, 이를 하나로 통합하는 과정에서 비즈니스 로직 코드 중복이 발생함. - 코드 중복을 해결하면서 제휴사 마다 다른 구현 사항을 고려하여 처음 설계한 아키텍쳐는, PointChangeService라는 abstract class에 공통 로직을 작성하고, 각 제휴사 마다 다른 부분은 abstract 메서드로 만들어 상속을 이용해 구현을 강제하는 방법이었음. - 그러나 서비스가 점차 커지고 코드가 복잡해지면서 순환 의존 (Cycle Dependency) 문제가 발생함. - 더불어 PointChangeService의 책임이 너무 많다는 문제점도 있었음. 결국 XXPointChangeService는 제휴사 마다 다른 구현부와 공통 비즈니스 로직을 모두..
Exception 처리, 어떻게 하는게 좋을까?
Exception 처리, 어떻게 하는게 좋을까?
2019.05.29Error와 Exception의 차이 에러 : 애초에 예상이 불가능한 것. 예외 : 발생을 예상할 수 있는 것. 그리고 예상할 수 있기 때문에 그에 대한 대비로 try-catch가 있는 것. checked exception 컴파일 타임에 경고를 해주는 예외. 예외 처리가 안되어 있으면 컴파일이 안된다. 컴파일 타임에 발생하는 Exception이라고 말하기는 좀 그렇다. 정확히는 Exception은 Runtime에 발생하며 컴파일 타임에 경고를 해주는거지. 대표적인게 `` IOException, SQLException`` unchecked exception 컴파일 타임에 경고를 안해주는 예외. 예외 처리가 안되어 있어도 컴파일이 된다. 대표적인 것이 `` NPE, IndexOutOfBoundsExcepti..
REST api / RESTful 이란.
REST api / RESTful 이란.
2019.05.03REST (Representational State Transfer) An API that provides network-based access to resources via a uniform interface of self-descriptive messages containing hypertext to indicate potential state transitions might be part of an overall system that is a RESTful application(link) - Roy T. Fielding self-descriptive message? 메시지 자체가 자기 자신을 설명하는 메시지. "어디로 가는가? 어떤 동작을 하는가?" 등이 메시지에 나타나야 함 메시지를 제공하는 서버..
상속 vs 컴포지션 구분 : delegation, decorator, wrapper
상속 vs 컴포지션 구분 : delegation, decorator, wrapper
2019.02.04Effective Java : 아이템 18. (기능 확장이 필요할 때)상속보다는 컴포지션을 사용하라 [Effective Java] 4장 클래스와 인터페이스 상속이란? extends를 말함. (implements는 아님. 이건 구현.) 컴포지션이란? Composition은 필요한 객체를 내부 private 변수로 두는 것 기존 클래스가 새로운 클래스의 구성요소로 쓰인다는 뜻 [Coding/CodingNote] - [코딩 노트] 객체 지향 패러다임 둘 다 어떤 클래스에 기능을 추가하거나, 책임을 더해서 확장하고 싶을 때 사용 할 수 있으나, 근본적인 의미가 다르다. 무조건 컴포지션을 써야 한다는 의미가 아니라, 의미에 맞게 사용해야 한다. (하단 '상속과 컴포지션을 구분하는 방법' 참고) 상속의 단점? 상속..
디자인 패턴 - Singleton
디자인 패턴 - Singleton
2018.06.22singleton VS static 어차피 하나만 생성되는 객체라면 ``java static`` 메서드만 가진 클래스로 만들어도 똑같은거 아닌가 싶을 수도 있겠지만, 다음과 같은 장점 이 있다. OOP 패러다임 : 싱글턴은 OOP 패러다임을 따르는 객체이지만, static은 객체가 아니므로 OOP 패러다임과는 거리가 멀다. 상속 : 싱글턴은 인터페이스를 구현하거나, 클래스를 상속받거나, 상속해줄 수 있음. (반면 static은...) 인스턴스화 : 싱글턴은 static class와 달리 인스턴스화가 가능하다. (static은 인스턴스화가 의미가 없다) 인스턴스화가 가능하다는 것은 필드, 매개변수로 전달, 리턴 가능하다는 것이다. 상속 & 인스턴스화 가능하다는 것은? == 다형성을 사용할 수 있다. 다형성..
Design Pattern, 디자인 패턴
Design Pattern, 디자인 패턴
2018.05.14이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
고민이 길어질 때, 어느쪽 선택이 우세한지 감이 안올 때, 일단 짜라!
고민이 길어질 때, 어느쪽 선택이 우세한지 감이 안올 때, 일단 짜라!
2017.12.02이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.