인프런 김영한님의 스프링 핵심 원리 - 기본편 강의 내용을 바탕으로 작성한 글입니다. 지금까지 다양한 빈 스코프에 대해 알아보았다. 개발자는 어플리케이션의 특성에 따라 적절한 빈 스코프를 선택해야 하지만, 프로토타입 빈과 싱글톤 빈을 함께 사용할 때는 주의해야 할 점이 있다. 먼저 아래와 같이 동작하는 프로토타입 빈이 있다고 가정하자. 1. 클라이언트 A가 스프링 컨테이너에 프로토타입 빈을 요청한다. 2. 스프링 컨테이너가 프로토타입 빈 인스턴스(PrototypeBean@x01)를 생성해서 반환한다. PrototypeBean@x01.count: 0 3. 클라이언트 A가 addCount()를 호출하여 count 필드를 1 증가시킨다. PrototypeBean@x01.count: 1 위와 같은 상황에서, 클..
인프런 김영한님의 스프링 핵심 원리 - 기본편 강의 내용을 바탕으로 작성한 글입니다. 1. 빈 스코프란? 빈 스코프란, 빈이 생성되어 소멸되기까지의 범위를 의미한다. 지금까지는 스프링 컨테이너가 뜰 때 스프링 빈이 생성되고, 스프링 컨테이너가 종료될 때 함께 소멸한다고 배웠다. 하지만 어플리케이션을 개발하다 보면 다양한 스코프를 가진 빈이 필요해진다. 예를 들어, 클라이언트 요청에 대해 로그를 찍으려면 요청이 들어올 때 빈을 생성하고, 요청이 종료되면 빈을 소멸시켜야 한다. 이처럼 빈의 생명주기를 싱글톤과 다르게 제어할 필요가 있기 때문에, 스프링 컨테이너에서는 다양한 빈 스코프를 지원한다. 빈 스코프에는 다음과 같은 종류가 있다. 싱글톤: 스프링 컨테이너가 시작할 때 생성되어 종료될 때 소멸되는, 스프..
인프런 김영한님의 스프링 핵심 원리 - 기본편 강의 내용을 바탕으로 작성한 글입니다. 1. 초기화 작업의 필요성 데이터베이스와의 커넥션은 연결을 설정하는 데 오래 걸리기 때문에, 애플리케이션 서버와 DB 사이의 커넥션을 미리 생성해둔다. 그리고 DB 연결 요청이 오면 연결해두었던 커넥션을 빌려주는 방식으로 동작한다. 이 커넥션은 보통 애플리케이션이 시작되는 시점에 생성되고, 애플리케이션이 종료될 때 함께 종료된다. 때문에 초기화와 종료 작업이 필요하다. 💡초기화 작업을 생성자에서 진행하면 안되는 이유? 생성자는 이름 그대로 객체 생성을 위한 메서드이다. 생성자는 초기화 작업보단 객체 생성에 집중하는 것이 SRP에 더 알맞고, 유지보수적인 측면에서 좋다. 초기화 작업에는 외부 커넥션 연결 등 무겁고 예외를..
인프런 김영한님의 스프링 핵심 원리 - 기본편 강의 내용을 바탕으로 작성한 글입니다. 의존관계 주입이란, 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성해 클라이언트에 전달하는 것이다. 이전에 제어의 역전과 함께 알아본 적이 있었다. 그렇다면 클라이언트에게 구현 객체를 어떻게 전달할까? 크게 4가지 방법이 있다. 1. 생성자 주입 말 그대로 생성자를 이용해서 의존관계를 주입하는 방법이다. 생성자를 호출할 때, @Autowired가 붙어있으면 스프링 컨테이너에서는 매개변수와 같은 타입의 빈을 찾아 생성자에 넣어준다. @Component public class OrderServiceImpl implements OrderService { private final DiscountPolicy discou..
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/150366 풀이 처음에는 사용자 정의 클래스를 이용해 풀었는데, 값이 난리가 나서 원시 자료형을 이용해 풀었다. 병합과 분할이라는 키워드를 보고, 유니온 파인드를 떠올렸다. 배열 선언하기 static int N = 50; String[] table = new String[N*N+1]; int[] parent = new int[N*N+1]; 각 셀은 자신의 값과, 부모 노드의 인덱스를 저장해야 한다. 따라서 값을 저장할 String 배열과, 병합된 셀의 인덱스를 저장하는 int형 배열을 선언해주었다. 표의 크기가 50x50으로 고정되어 있으므로 배열의 길이는 50*50+1 = 2501로 설..
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92343 풀이 풀이방향을 잘못 잡아서 고생했다. 처음에는 리프 노드부터 거슬러 올라가면서 양 노드와 가까운 순서대로 높은 점수를 부여한 뒤, 우선순위 큐를 이용해서 풀었다. 그런데 이렇게 하면 1번 노드와 6번 노드가 동일한 점수를 갖게 된다. 2개의 양 노드를 방문할 수 있는 1번 노드가 더 유리한 선택지인데도 말이다. 그래서 이 방법은 틀린 풀이라는 결론을 얻게 되었다. 결국 구글의 도움을 받았고..ㅋㅋㅋㅋㅋ 이런 풀이를 발견했다. 핵심은 방문했던 노드 목록을 저장하는 것이다. 1-3-2 순서로 방문했을 때와 1-2-3 순서로 방문했을 때는 동일한 상태이다. (노드의 방문 순서는 문제..