
URI, URL, URN URI는 Uniform Resource Identifier의 약자이다. 확인하는 방법?을 통합하여 URI라고 부르는 것 같다. 확인하는 방법에는 URL과 URN이 있다. URN(Resource Name) 자원을 확인할 때? 이름을 부여한다. 이름으로 부여하게 되면 찾기 정말 어렵기 때문에 거의 사용하지 않는다. URL(Resource Locator) 우리가 평상시에 사용하던 URL이 이 URL이다. URL은 자원이 있는 위치를 지정한다. scheme://[userinfo@]host[:port][/path][?query][#fragment] https://www.google.com :443 /search ?q=hello&hl=ko 프로토콜, 호스트명, 포트 번호, path, 쿼리 ..

IP(Internet Protocol) IP는 우리가 흔히 말하는 IP주소의 그 IP이다. IP의 역할은 지정한 IP주소에 데이터를 전달한다. 여기서 패킷이라는 통신 단위로 데이터를 전달한다. 패킷에는 출발지 IP, 목적지 IP 등이 있고 전송 데이터가 있다. 하지만 IP프로토콜은 다음과 같은 한계를 가지고 있다. 비연결성 패킷이 도착할 곳의 서버가 없거나, 종료(?)되있어도 패킷을 전송한다. 비신뢰성 중간에 패킷이 사라질 수도 있다 패킷을 1 2 3 순서대로 보냈는데, 2 1 3 이런 식으로 순서가 보장이 안된 체 도착할 수 있다. 프로그램 구분 만약 한 곳에 서로 다른 애플리케이션이 같이 들어올 때 구분지을 방법이 없다 TCP UDP 우리는 TCP/IP을 많이 들어보았을텐데, 이것은 프로토콜이 아니라..

싱글톤 빈 우리가 평소에 쓰던 스프링 빈은 기본적으로 싱글톤 스코프로 생성된다. 싱글톤은 클라이언트 A, B, C가 동시에 요청하든 따로 요청하던지 간에 같은 객체를 반환한다. @Test void singletonBeanFind() throws Exception{ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class); System.out.println("================================"); SingletonBean singletonBean1 = ac.getBean(SingletonBean.class); SingletonBean singletonBean2 ..

콜백 메서드가 필요한 이유 애플리케이션 시작할 때 외부 네트워크와 연결을 하고, 종료 시점에 연결을 모두 종료하는 상황 애플리케이션 시작 시점에 NetworkClient를 생성하면서 connect를 통해 연결을 함 종료 시점에는 disconnect를 통해 연결을 끊기 빠른 결론 처음 이 부분을 공부했을 때, 머릿 속으로 도저히 이해가 되질 않았다. 그래서 이 글을 본 분들이나 미래의 나에게 빠른 이해를 돕고 싶다. 유치할 수도 있지만 빠르게 이해하기 위해서 각 코드 사이마다 숫자를 넣어보았다. 실행 순서를 알기 위함이지 의미 있는 숫자들은 아님!! BeanLifeCycleTest.class public class BeanLifeCycleTest { @Test void lifeCycleTest() thro..

다양한 의존관계 주입 방법 의존관계 주입은 생성자 주입, setter 주입, 필드 주입, 일반 메서드 주입이 있다. 생성자 주입 생성자를 통해 의존 관계를 주입 받는 방법 생성자가 딱 1개만 있으면 @Autowired를 붙이지 않아도 자동 주입 된다. private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { this.memberRepository = memberRepository; this.discountP..
@ComponentScan 이전에 우리는 빈 등록을 수동으로 등록했다. AppConfig에서 의존관계 주입을 하고, 거기에 @Bean을 입력하여 스프링 컨테이너에 빈 등록을 했다. 그러나 빈이 수 백개가 있다면 하나하나 빈을 등록해야 하기 때문에 번거로움이 있다. 그래서 등장한 것이 ComponentScan이다. ComponentScan은 설정 정보에 붙여주고, Component가 붙은 클래스를 찾아 빈으로 등록한다. 클래스를 찾을 때, 우리는 basePackages를 이용하여 탐색할 경로를 지정해줄 수 있다. default값은 ComponentScan이 있는 설정 정보 클래스의 패키지가 시작 위치가 된다. 그렇다면 빈은 등록이 됐지만, 의존관계 주입은 어떻게 해줄까? Component가 붙은 클래스에서..

싱글톤 패턴 AppConfig을 보면 객체를 호출할 때마다 새로운 객체를 생성한다. 그렇다면 고객이 동시에 요청을 했다면, 매 호출마다 새로운 객체를 생성해야해서 시간도 오래 걸리고, 메모리 낭비도 시하게 된다. 그래서 해당 객체를 한 개만 생성하고, 요청이 들어올 때마다 하나의 객체를 가지고 공유하는 싱글톤 패턴이라는 것이 있다. 싱글톤 패턴이란 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 싱글톤 패턴을 적용한 코드는 여러 종류가 있지만 그 중 하나인 private 생성자를 사용하여 외부에서 새로운 클래스 인스턴스를 막는다. SingletonService 객체를 private static final로 선언하고, getInstance 메서드를 통해서만 인스턴스를 얻을 수 있다...

빈 등록 빈을 등록하기 위해서는 @Bean 설정된 메서드를 모두 호출하게 된다!! 스프링 컨테이너에 저장하기 위해서이다 ApplicationContext를 스프링 컨테이너라고 한다. 모든 걸 관리해준다. AppConfig.class는 구성 정보가 저장된 클래스 (@Configuration)이다. 그래서 AppConfig에 있는 @Bean들을 모두 applicationContext라는 스프링 컨테이너에 저장(호출)을 한다. 여기서 이제 Bean을 get해야하는데, 이 때 getBean 메서드를 이용하여 가져온다. 이 때, getBean의 인자로는 Bean 이름과, 타입이 온다. Bean을 저장할 때, 메서드 이름으로 저장하기 때문에 메서드 이름을 인자로 사용하면 된다. 스프링 컨테이너에 등록된 빈 들의 이..
오답 노트 & 새로 알게 된 점 해당 문제는 MST알고리즘 기본 문제이다. 왜 이 문제가 MST 문제인지를 알아야할 것 같다. 보면 문제에서 모든 컴퓨터가 연결이 되어 있어야 한다. 모든 컴퓨터를 연결하는데 필요한 최소비용을 출력하라. 라는 말이 MST를 이용하라는 것 같다. 최소 비용으로 연결하기 위해서는 간선을 최소화시켜야하고, 그 중에서 가중치를 제일 낮은 것들을 선택해야한다. 또한, 컴퓨터가 모두 연결이 되어 있어야한다는 조건도 말이다. 그래서 크루스칼 알고리즘을 사용하여 findSet, unionSet 자료구조를 직접 구현하고, 출발과 끝, 가중치를 저장하고 있는 ArrayList를 가중치에 따라 오름차순으로 정렬하고, parent 배열을 이용하여 구현했다. 여기서 유심히 보아야 할 점은 uni..

서로소 집합에 대한 연산 makeSet(v) 유일한 노드 v를 포함하는 새로운 집합을 생성하는 연산입니다 왜 -1로 초기화 시키는 걸까? index는 음수가 될 수 없기 때문에 편하게 나타내기 위해 음수로 나타냅니다. 그리고 음수는 해당 집합의 "대표자"를 나타내게 됩니다. findSet(v) v를 포함하는 집합을 찾는 연산입니다. 즉, 대표자를 찾는 연산이라고 생각하시면 됩니다. unionSet(u, v) u와 v를 포함하는 두 집합을 "통합"하는 연산, 즉, "대표자"를 같게 해줍니다 v를 포함한 집합의 대표자는 u를 포함하는 집합의 대표자를 가르키게 됩니다 해당 연산들은 나중에 "최소 신장 트리"를 구하는데 필요한 자료구조입니다 코드 static int parent[] = new int[6]; pu..

그래프에서 최소 비용 문제 모든 정점을 연결하는 간선들의 가중치의 합이 최소가 되는 트리 두 정점 사이의 최소 비용의 경로 찾기 신장 트리 신장 트리는 N개의 정점으로 이루어진 연결 그래프에서 N개의 정점과 N-1개의 간선으로 이루어진 트리입니다. 즉, N-1개의 간선으로 "모든 정점들이 연결"되어있습니다. 당연히 트리이기 때문에 사이클이 존재하면 안됩니다~~ 최소 신장 트리 무방향 가중치 그래프에서 신장 트리를 구성하는 간선들의 가중치의 합이 최소인 신장 트리 구하는 알고리즘으로는 "프림"과 "크루스칼"이 있습니다. 크루스칼 알고리즘 가중치가 가장 작은 간선이 사이클을 만들지 않을 때에만 그리디하게 간선을 추가시킵니다. 간선의 개수가 M개라고 할 때, 시간 복잡도는 가중치로 정렬 : O(MlogM) 간..
오답 노트 & 새로 알게 된 점 해당 문제를 풀면서 중요한 부분을 배웠다. 알고리즘은 절대로 정형화해서 풀지 말자. 원래 일반적으로 dfs를 풀 때, dfs함수를 호출하고 방문 체크를 해주는데 해당 문제는 그러면 안됐다. 예제2) 1. 1 -> 4 -> 5 -> 1 처럼 cycle이 있는 것은 1 4 5에 모두 1이 있어야하지만, 2. 2 -> 7 -> 3 처럼 cycle이 없는 것은 7 3에만 1이 있어야한다. 그래서 위와 같이 일반적으로 dfs를 푸는 것처럼 바로 방문체크를 하게 된다면, 1번은 맞게 되지만, 2번에서 2도 1이 된다. 그래서 틀리게 된다. 해결 방법은 dfs를 재귀 호출할 때 방문 체크를 해주면 된다. 두 가지 방법을 사용하여 문제를 풀었는데, 위 얘기는 1번 코드와 관련있다. 2번..