전체 글 보기 148

[토비의 스프링부트] Containerless

컨테이너리스 : 서버리스 웹 컴포넌트는 웹 컨테이너 안에 들어가 있어야 한다. 웹 컴포넌트는 동적 응답을 주기 위해 존재한다. 웹 컨테이너는 여러 웹 컴포넌트를 가지고 있다. 자바에서는 웹 컴포넌트를 서블릿이라고 부른다. 웹 컨테이너가 서블릿 컨테이너이다. 스프링 컨테이너는 서블릿 컨테이너의 뒤에 존재한다. 여러 빈을 갖고 서블릿을 통해 들어온 요청을 받아서 스프링 컨테이너에 요청해서 빈에게 작업을 하도록 한다. 스프링 컨테이너가 서블릿 컨테이너를 대체할 수는 없다. 우리는 스프링 컨테이너에 어떤 빈을 등록하고 동작을 지정하고만 생각하고싶은데, 서블릿 컨테이너를 띄워야만 서비스를 실행할 수 있다. 스프링에서 web.xml에 설정 해본 적이 있을 것이다. 이를 지정해야만 서블릿 컨테이너를 띄울 수 있었다...

[자바] 상속보다는 조합 사용하기

출처 : https://tecoble.techcourse.co.kr/post/2020-05-18-inheritance-vs-composition/ 상속보다는 조합 사용하기 상속의 단점 : 캡슐화를 깨뜨린다. 상위 클래스의 구현이 하위 클래스에 의해 노출되는 상속은 캡슐화를 깨뜨린다. 캡슐화가 깨짐으로써 하위 클래스가 상위 클래스에 강하게 결합 및 의존하게 되고 이는 변화에 유연히 대처할 수 없다. 로또 번호를 갖는 클래스를 보자 public class Lotto { protected List lottoNumbers; public Lotto(List lottoNumbers) { this.lottoNumbers = new ArrayList(lottoNumbers); } public boolean contai..

공부/자바 2023.02.07

[자바] 인터페이스를 분리하여(전략패턴) 테스트하기 좋은 메서드로 만들기

출처: https://tecoble.techcourse.co.kr/post/2020-05-17-appropriate_method_for_test_by_interface/ 인터페이스를 분리하여 테스트하기 좋은 메서드로 만들기 … tecoble.techcourse.co.kr 인터페이스를 분리하여(전략패턴) 테스트하기 좋은 메서드로 만들기 전에 본 메서드 시그니처를 수정하여 테스트하기 좋은 메서드 만들기에서는 테스트하기 어려운 의존을 매개변수로 전달받아 테스트하였다. 이 방법은 의존 관계를 상위로 이동시키는 것에 불과하고, 응집도가 떨어지게 된다. 전략패턴을 활용하여 인터페이스 분리 후 테스트해보자. public class Car { private static final int MOVABLE_LOWER_BOU..

공부/자바 2023.02.02

[자바] 일급 컬렉션(First Class Collection)

출처 : https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection ㅇ일급 컬렉션(First Class Collection) Collection을 wrapping하면서 Collection외 다른 멤버변수가 없는 것을 의미한다. Collection을 Wrapping한다는 것은 다음과 같다 public class Person { private String name; private List cars; // ... } public class Car { private String name; private String oil; // ... } 출처: 위 코드를 아래처럼 바꾼다. public class Person { private String n..

공부/자바 2023.01.17

[자바] 디미터의 법칙, getter를 잘 쓰기

ㅇ 디미터의 법칙(Law of Demeter) 디미터의 법칙은 Demeter라는 프로젝트를 진행하던 개발자들이 어떤 객체가 다른 객체에 대해 지나치게 많이 알기 때문에 결합도가 높고 좋지 못한 설계를 야기한다는 것을 발견하였다. 이를 개선하고자 객체에 자료(상태값)은 숨기고 함수를 공개한다. 이것이 디미터의 법칙이다. 즉, 다른 객체가 어떤 자료(상태값)을 갖고 있는지 몰라야 한다는 것이다. = don’t talk to strangers(낯선 이에게 말하지 마라) , principle of least knowledge(최소 지식 원칙)로 알려져있다. 또는 직관적으로 이해하기 위해 여러 개의 .(도트)를 사용하지 말라고도 알려져 있다. 디미터의 법칙을 준수하면 캡슐화를 높여 응집도를 높일 수 있다. ㅇ O..

공부/자바 2023.01.16

[자바] ConcurrentHashMap

ConcurrentHashMap HashTable클래스의 대부분 메서드는 synchronized 키워드가 존재하여 메서드가 임계구역으로 설정되어 있다. 이는 Thread-safe하지만 동시에 접근할 때 병목현상이 발생한다. HashMap클래스는 synchronized 키워드가 존재하지 않는다. 그렇기에 성능은 좋지만 multi-thread 환경에서는 사용할 수 없다. ConcurrentHashMap클래스는 Hashtable클래스의 단점을 보완하며 multi-thread환경에서 사용할 수 있도록 나온 클래스이다. ConcurrentHashMap클래스는 synchronized키워드가 메서드 전체에 적용되어 있지 않고, put메서드 중간 특정 부분에만 적용되어 있다. public V put(K key, V v..

공부/자바 2022.12.27

[네트워크] 포워드 프록시와 리버스 프록시

포워드 프록시(Forward Proxy)와 리버스 프록시(Reverse Proxy) 아파치 웹서버에는 mod_proxy라는 모듈에서 forward proxy와 reverser proxy 두 가지 기능을 제공하며, nginx는 필요한 기능만 제공하는 고성능 웹 서버에 맞게 reverse proxy 기능만 제공한다. Forward Proxy : 클라이언트가 특정 사이트에 접근할 때 직접 연결하지 않고 포워드 프록시 서버가 요청을 받아 해당 사이트에 연결한 후 그 결과를 클라이언트에게 전달한다. 포워드 프록시는 캐싱기능이 있어, 자주 사용되는 컨텐츠에서 성능 향상이 된다. 또한 정해진 사이트만 연결하게 제한할 수 있어 보안에 유리하다. Reverse Proxy : 리버스 프록시로 웹 서버를 설정할 경우 사용자..

공부/네트워크 2022.11.14

[spring] 디렉터리 구조

패키지 구성 유형에는 크게 레이어 계층형, 도메인형 두 가지 유형이 있다. 계층형 구조는 각 계층을 대표하는 디렉터리를 기준으로 코드를 모은다. 디렉터리에 클래스들이 너무 많이 모이는 단점이 있다. 도메인형 구조는 도메인 밑으로 각각 계층별 디렉터리를 생성한다. 과거에는 계층형으로 큰 틀을 잡고 그 안에서 도메인별로 나눠서 사용했었던 것 같다. 그런데 애초에 도메인으로 큰 틀을 잡고 내부에 계층으로 나누는 것이 개발할 때(디렉터리 넘나들기) 더 편할 것 같다. 관련된 코드들이 응집해 있기 때문에 자연스럽게 코드 스타일, 변수, 클래스명들을 비슷한 스타일로 개발할 수 있다. 정리된 좋은 글 : https://cheese10yun.github.io/spring-guide-directory/#-4 Spring..

[oracle] 오라클 PL/SQL 예외처리(Exception)

오라클 PL/SQL 예외처리(Exception) 오라클에서 제공하는 예외와 사용자가 정의하는 커스텀 예외가 있다. 커스텀 예외 처리 : 예외 선언 -> 예외 호출 -> 예외 수행 순서로 작성한다. 예제: CREATE OR REPLACE PROCEDURE CUSTOM_PROC( NUM IN NUMBER, OUT_MSG OUT VARCHAR2 ) IS NUM_CHECKER EXCEPTION -- 커스텀 예외 선언 BEGIN IF NUM > 10 THEN -- EXCEPTION 조건 설정 RAISE NUM_CHECKER; -- EXCEPTION 호출 END IF; RAISE NO_DATA_FOUND; EXCEPTION WHEN NUM_CHECKER THEN -- 조건이 맞아 예외가 발생한 경우(RAISE) B..