카테고리 102

Software Architecture -1 SOLID 법칙 완전정복편

개요 로버트 C 마틴의 Clean Architecture 를 보고 Software Architecture란 무엇인지, 왜 필요한지, 어떤 원칙들이 존재하는지 배우다가 번역체로 읽는게 쉽지 않고, 지식으로 정립이 잘 되지 않아서 정리하려고 시작했습니다. 로버트 마틴의 큰 틀에 개인적으로 이해한 견해와 예시코드를 만들어 붙였습니다. Software에 Architecture가 존재할 수 있는 이유는, 반세기 동안 하드웨어는 더 작아지고 빨라졌지만, 소프트웨어를 '구성' 하는 것들은 조금도 바뀌지 않았기 때문입니다.(컴포넌트, 클래스, 함수, 모듈, 계층, 서비스 등) (반박 시 당신이 앨런 튜링) 흔히 소프트웨어의 설계를 건축물과 비교를 많이 합니다. 건축물은 물리적 한계 때문에 선택지가 제한되어 더 명확한 ..

java.lang.ClassNotFoundException: 특정 Db Driver 못찾는 오류

보통 회사의 프로젝트를 하다보면 한 Project에서 여러 Db 연동을 경험할 수 밖에 없다. (보통 yml, properties로 연동) 그 상황에서 내가 최근에 겪은 오류는, 원격의 site에서 db를 연동하여 로컬에서 테스트 환경을 적용할 때 일어난 일이다. sybase의 저버전이나 vertica같은 경우(지원이 안되거나) 따로 project의 lib에 탑재할 확률이 있다. (열악한 환경에 따라서) 그래서 버전별로 아래와 같이 jdbc를 compile 선언을 해줄 수 있다. (나는 gradle이다.) 그래도 내가 겪었던 오류는, 위의 모든 환경과 상관 없이 ClassNotFoundException 이었는데, 간단히 해결해보자면 위의 모든 상황의 대처를 했던 사람은 추가적으로 intelliJ라면 Fi..

오류 2022.12.30

[Spring AOP] 2.ProxyFactory로 대상에 따른 기술에 구애받지 않고 Proxy 생성,적용하기 (Advisor, Advice, PointCut)

해당 내용에 대한 이해를 위해 사전 지식을 원한다면 링크를 참고해주세요. 참고글 : https://nomoreft.tistory.com/107 ProxyFactory, Advice, Pointcut 개발자는 ProxyFactory로 Interface인지, Class인지 구분하지 않고, Advice를 등록하면 된다. ProxyFactory는 Interface가 있으면 JDK Proxy를 생성하고, 없으면 CGLIB를 생성해서 Client에게 제공한다. ProxyFactory로 생성된 Proxy는 Advice를 호출한다. 그래서 사용자는 Proxy의 종류에 구애받지 않고 Advice로 공통기능을 작성하면 된다. 특정 메서드 패턴만 작동한다던지 동작에 조건을 걸때는 PointCut을 사용하면 된다. Point..

스프링 2022.11.16

[Spring AOP] 1.JDK Dynamic Proxy/CGLIB로 인터페이스 or 클래스 기반의 프록시 객체를 쉽게 생성하는 방법

JDK Dynamic Proxy JDK Dynamic Proxy란? JDK에서 제공하는 Dynamic Proxy 기능을 사용하면 인터페이스 기반의 프록시 객체를 쉽게 생성할 수 있다. JDK Dynamic Proxy는 인터페이스를 구현한 클래스의 객체를 생성할 때 사용한다.(인터페이스가 필수) JDK Dynamic Proxy는 InvocationHandler 인터페이스를 구현한 클래스의 객체를 생성자 파라미터로 넘겨주면 된다. JDK Dynamic Proxy는 인터페이스의 모든 메서드를 구현한 프록시 객체를 생성한다. JDK Dynamic Proxy 예제 공통 기능을 가진 Proxy를 구현 @Slf4j public class TimeInvocationHandler implements InvocationH..

개발언어/JAVA 2022.11.16

[Reflection] 자바가 동적으로 Class, Method의 메타데이터를 획득하여 작동시키는 방법

동적 프록시 프록시를 동작을 원하는 개수만큼 생성해놓는게 아니라, 동적으로 객체를 만들 수 있다. 프록시를 적용할 코드를 하나 만들고, 동적 프록시 기술로 원하는 만큼 찍어내면 된다. 그러기 위해서는 기본적으로 자바가 어떤 클래스, 어떤 메서드던지 획득, 작동을 시킬 수 있어야 한다. 그래서 자바에서는 Reflection API를 제공한다. Reflection API 대표적으로 package명으로 Class를 가져오고, 이름으로 해당 Class의 Method명을 가져오면 된다. 개인적으로는 해당 Class의 Method를 전부 가져와서 Enum으로 메서드명을 value로 가져와서 일치하면 실행시키는 식으로 개발했었다. 예시 @Slf4j public class ReflectionTest { /** * Re..

개발언어/JAVA 2022.11.16

[디자인 패턴] 프록시 패턴(Proxy Pattern), 데코레이터 패턴(Decorator Pattern)

Proxy란? Client(요청자) 와 Server(제공자) 사이에 Proxy(대리인)을 의미한다. 이 Client와 Server는 굉장히 넓은 의미가 될 수 있는데, 여기서는 웹 브라우저 - 웹 서버의 개념이 아닌, 객체간의 호출자와 호출 당한 객체를 의미한다. Proxy 도입 장점 우선, 직접 호출을 하지 않고 대리자를 하나 세웠다는 것 만으로 많은 것을 할 수 있다. (이미 Spring에서 Proxy를 많이 사용한다.) 대상에게 접근을 제어하거나, 캐싱을 할 수 있다. 권한에 대한 접근 차단 캐싱 지연로딩 (client가 프록시를 가지고 놀다가 실제 요청이 들어오면 실 객체를 제공한다) 대상에게 추가적인 기능을 제공할 수 있다. 원래 서버가 제공하는 기능 + 알파 ex) 요청값이나 응답 값을 중간에..

개발언어/JAVA 2022.11.05

[디자인 패턴] 템플릿 메서드 패턴, 전략 패턴

템플릿 메서드 패턴 (Template Method Pattern) 핵심 비즈니스 로직을 제외하고, 동일한 구조를 가진 부가 기능들을 템플릿처럼 변환해서 핵심 로직만 변환해서 찍어내는 패턴이다. 변하는 것과 변하지 않는 것을 분리 핵심 기능은 변하고 로그남기기, 트랜잭션 기능 등은 반복되고 변하지 않는다. 이 둘을 분리해서 모듈화 해야 좋은 코드다. --- 구현 @Slf4j public abstract class AbstractTemplate { public void execute() { long startTime = System.currentTimeMillis(); //비즈니스 로직 실행 call();//상속 //비즈니스 로직 종료 long endTime = System.currentTimeMillis(..

개발언어/JAVA 2022.11.03

[백준 2143 java 자바]두 배열의 합 - 투포인터(부분합, 이중배열)

[Gold III] 두 배열의 합 - 2143 문제 링크 성능 요약 메모리: 50704 KB, 시간: 920 ms 분류 이분 탐색(binary_search), 누적 합(prefix_sum) 문제 설명 한 배열 A[1], A[2], …, A[n]에 대해서, 부 배열은 A[i], A[i+1], …, A[j-1], A[j] (단, 1 ≤ i ≤ j ≤ n)을 말한다. 이러한 부 배열의 합은 A[i]+…+A[j]를 의미한다. 각 원소가 정수인 두 배열 A[1], …, A[n]과 B[1], …, B[m]이 주어졌을 때, A의 부 배열의 합에 B의 부 배열의 합을 더해서 T가 되는 모든 부 배열 쌍의 개수를 구하는 프로그램을 작성하시오. 예를 들어 A = {1, 3, 1, 2}, B = {1, 3, 2}, T=5인..