빈의 생명 주기 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료 초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출 소멸전 콜백: 빈이 소멸되기 직전에 호출 스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다. 1. InitializingBean, DisposableBean 인터페이스 사용 public class NetworkClient implements InitializingBean, Dispo..
컴포넌트 스캔이란? 지금까지는 @Configuration이 붙은 설정 파일을 이용하여 빈을 수동 주입하였다. 이렇게 개발자가 수동으로 빈을 주입하고 의존 관계를 정해줄 수도 있지만, 만약 등록할 빈이 많다면 일일이 모두 등록해야 해서 상당히 귀찮다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. @Component public class OrderServiceImpl implements OrderService { private final DiscountPolicy discountPolicy; public OrderServiceImpl(DiscountPolicy discount..
스프링 컨테이너란? 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 여기서 말하는 자바 객체를 스프링에서는 빈(Bean)이라고 부른다. 이런 식으로 스프링 컨테이너 안에 스프링 빈 저장소가 있고, 그 안에 빈이 들어있다고 생각하면 된다. 스프링 컨테이너의 종류 BeanFactory 스프링 컨테이너의 최상위 인터페이스다. 스프링 빈을 관리하고 조회하는 역할을 담당한다. ApplicationContext BeanFactory 기능을 모두 상속받아서 제공한다. 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까? 정리 ApplicationContext는 BeanFactory의 기능을 상속받는다. App..
개발일기 (22.12.31) 개발자라는 꿈을 가지고 공부를 시작한 지도 6개월이 넘어간다. 남들에 비해 늦게 시작했다는 압박감으로 시작했었다. 현재는 그러한 압박감보다는 내가 정말 열심히 하고, 꾸준히만 한다면 내가 원하는 목표를 이룰 수 있다는 확신이 생겼다. 방학중에 스프링에 많은 시간을 투자할 생각이다. 우선 김영한 님의 스프링 로드맵을 전부 구매하였다. 우연하게 김영한 님의 스프링입문 강의를 들었는데, 이론이 부족한 나에게 큰 도움이 된다고 느껴졌다. 그래서 전부 들어보고 싶다는 생각이 들었다. 사실 내가 하고 싶어 하는 공부에 있어서 욕심이 너무 많아서 구매를 안 할 수가 없었다. 마침 7주년을 맞이하여 할인을 하여 나름 싼 가격에 구매할 수 있었다. 오늘도 김영한 님의 강의를 들었는데, 그저 ..
JPA란? Java persistence API이다 persistence : Persistence(영속성) : 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미, 영속성은 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 구현 자바에 있는 데이터를 영구히 기록할 수 있는 환경(스토리지 내 DBMS)에 영구히 저장할 수 있도록 하는 환경을 제공하는 API라고 할 수 있음 API (Application Programming Interface) : 프로그램 사이 데이터 통신 규칙(상하관계가 존재) ↔ Protocol Protocol은 서로 동일시하여 규칙을 서로 합의하에 정함 JPA는 ORM 기술이다. ORM(Object Relation Mapping) :..
(1) 내장 톰캣을 가진다 톰캣을 따로 설치할 필요 없이 바로 실행가능하다. 웹서버 : 클라이언트가 요청하는 정적 콘텐츠를 전달하는 서버 웹 컨테이너 : Servlet, jsp를 실행할 수 있는 소프트웨어, 서블릿 컨테이너라고도 한다. 톰캣은 서블릿 컨테이너 중 하나이다. 요청을 받을 시 서블릿 컨테이너(톰캣)가 request, response 객체를 생성한다. (톰캣에서 BufferedWriter, BufferedReader를 통해 요청으로부터 가변길이의 문자를 받고 request, response 객체를 생성) 이후 요청에 매핑된 서블릿이나 프런트 컨트롤러로 전달 JSP 파일을 요청했을 때 동작 클라이언트가 어떤 동작을 함으로써 hello.jsp를 요청. 클라이언트가 JSP 파일을 요청할 경우 제어권..
스프링 핵심 스프링은 프레임 워크이다. 오픈소스이다. IoC컨테이너를 가진다. IoC(Inversion of Control): 제어의 역전 - Class: 설계도 - Object: 실체화가 가능한 것 롤 게임을 예로 들면 가렌이라는 캐릭터는 클래스가 실제 게임에서 실체화된 것이다. 하지만 챔피언은 추상적인 의미, 실체화가 될 수 없다. - 인스턴스: 실체화된 오브젝트 new 생성자를 통해 오브젝트를 힙 메모리공간에 올리게 되면( 실체화) 참조변수가 메모리 주소값을 가리키게 된다. 이 인스턴스를 다른곳에서 사용하기 위해서 똑같은 생성자를 통해 생성하더라도 이전에 생성된 인스턴스 새로 생성한 인스턴스 다른 메모리 주소를 레퍼런스 하고 있는 다른 인스턴스라고 할 수 있다. 이러한 인스턴스를 사용하기 위해서 스..
이번 문제는 BFS 문제이다. https://kimtaesoo99.tistory.com/85 너비 우선 탐색(BFS) 그래프 순회 저번에 배운 깊이 우선 탐색(Depth First Search) - 스택을 이용하여 그래프를 순회하는 방법 너비 우선 탐색(Breadth First Search) - 큐를 이용하여 그래프를 순회하는 방법 너비 우선 탐색(BFS) kimtaesoo99.tistory.com 위의 글에서 맨 마지막에 나오는 미로 찾기의 심화 문제이다. 핵심 이 문제는 생각을 달리해야 한다. S 부분에서 E부분까지 이동하는데, 벽으로 막힌 경우도 있다. 따라서 우리는 S에서 시작하여 끝까지 가는 것만이 아닌, S에서 시작하는 경우와 E에서 시작하는 경우 모두 생각한 뒤 벽에 도달하는 거리도 생각해주..
https://school.programmers.co.kr/learn/courses/30/lessons/43164 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 해당 문제는 DFS를 활용하여 풀 수 있었다. 처음에는 HashMap을 사용하여 풀려고 하였다. HashMap 의 맵을 만들고, 키 값에 시작점을 넣고 value값은 도착점을 넣으려고 하였다. (키값이 중복이 있을 수 있기 때문에 value의 값을 List 으로 하려 함) 하지만 이러한 풀이는 value의 순서에 따라 전부 방문하지 못하는 경우가 생기기도 하였다. 따라서 전부다 탐색을 시도해야 한..
동적 계획법(Dynamic Proframming)이란? 부분 문제를 해결한 결과를 이용하여 전체 문제를 해결하는 것 작은 나를 해결함으로써 더 큰 나를 해결함 동적 계획법의 문제 풀이 순서 1. 부분 문제를 정의한다. - 무슨 값을 구할지를 정의한다. 2. 점화식을 구한다. - 그 값을 어떻게 구할지에 대한 식을 세운다. ( 부분은 풀려있다고 가정) 3. 문제를 해결한다. - 값을 직접 구하는 코드를 작성한다. 동적 계획법을 활용한 대표적인 예시 피보나치 수 구하기가 있다. 점화식을 활용하기 위해 index 0,1에 해당하는 값을 미리 채워주어야 한다. 반복문을 통해 이전의 값을 활용하여 채워주면서 나아가면 된다. 동적 계획법 활용 문제 개인적으로 동적 계획법 자체는 쉽지만 부분 문제를 정의하는 것이 어..