[Spring] 스프링 핵심 원리 기본편 - 섹션 9~10
·
Spring
빈 생명주기 콜백스프링 빈은 다음과 같은 라이프 사이클을 가진다.스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료 스프링 빈은 객체를 생성하고, 의존관계 주입이 모두 끝난 후에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 때문에 초기화 작업은 의존관계 주입이 모두 완료된 후에 호출되어야 한다. 이를 위해 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 기능을 제공한다. 또한 소멸 콜백도 제공한다. 싱글톤 빈들의 경우, 스프링 컨테이너가 종료될 때, 싱글톤 빈들도 함께 종료되기 때문에 스프링 컨테이너가 종료되기 직전에 소멸 전 콜백이 일어난다.객체의 생성과 초기화를 분리하자! 생성자 안에..
[Spring] 스프링 핵심 원리 기본편 - 섹션 7~8
·
Spring
컴포넌트 스캔지금까지 살펴본 방법은 @Bean 을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 이는 개발자 입장에서 매우 귀찮은 작업이다. 때문에 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.컴포넌트 스캔컴포넌트 스캔을 사용하려면 @ComponentScan 애노테이션을 설정 정보에 붙여주면 된다.@Configuration@ComponentScanpublic class AutoAppConfig {}기존 설정 정보와 다르게 @Bean 을 통해 직접 등록한 스프링 빈이 하나도 없어도, 컴포넌트 스캔을 통해 @Component 애노테이션이 붙은 클래스를 스캔해서 자동으로 스프링 빈으로 등록한다. 이때, basePackages라는 속성을 통해 탐색할 패..
[Spring] 스프링 핵심 원리 기본편 - 섹션 4~6
·
Spring
제어의 역전과 의존관계 주입IoC (Inversion of Control)스프링과 같은 프레임워크를 사용할 때를 생각해보자. Controller, Service 같은 객체들의 동작을 우리가 직접 구현하기는 하지만, 해당 객체들이 어느 시점에 호출될 지는 신경쓰지 않는다. 단지 프레임워크가 요구하는대로 객체를 생성하면, 프레임워크가 해당 객체들을 가져다가 생성하고, 메서드를 호출하고, 소멸시킨다. 프로그램의 제어권이 역전된 것이다. 즉, 어플리케이션 코드에 작성한 객체들을 프레임워크가 필요한 시점에 가져다가 프로그램을 구동하기 때문에 프로그램의 제어권이 프레임워크로 역전된다. 이처럼, 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)라 한다.DI (Depende..
[아티클] SSH config를 통해 간편하게 SSH 연결하기
·
끄적끄적
저희는 지금까지 EC2에 접속하기 위해서 터미널에 아래와 같이 명령어를 입력해야만 했습니다.ssh -i "pem 키 위치" ubuntu@'퍼블릭 DNS 주소'너무 귀찮치 않으신가요?? 오늘은 이를 간편하게 접속할 수 있는 방법에 대해 알아보고자 합니다.1. .ssh 폴더 생성mkdir ~/.ssh (이미 존재한다면 이 단계는 넘어가셔도 됩니다!)2. 키페어 파일 가져오기EC2에 접속하기 위해 필요한 pem키!! 다들 기억하시죠? 현재 저장되어 있는 pem키의 위치를 홈 디렉터리 내의 .ssh 폴더로 이동시켜 줄게요.mv 'pem키이름.pem' ~/.ssh/그 후, 해당 pem키에 대해 권한을 설정해줘야겠죠? 아래 명령어를 입력합시다.chmod 400 "pem키 이름"3. Config 파일 설정하기그럼 이..
[아티클] JPA N+1 문제
·
끄적끄적
지연 로딩? 즉시 로딩?다들 3차 세미나 기억나시나요?@Entity@Getter@NoArgsConstructorpublic class Post extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String content; @ManyToOne(fetch = FetchType.LAZY) private Blog blog;}위의 코드는 3차 세미나에서 진행했던 코드 중 일부분입니다!저는 개인적으로 3차 세미나 내용을 복습하면서 fetch = FetchType.LAZY 가 무엇인지, 왜 지연 로딩 방식..
[Programmers] 표 편집 (Java) - 2021 카카오 채용연계형 인턴십
·
자료구조&알고리즘
문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/81303 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 문제 분석시간 복잡도를 줄이는 것이 관건인 문제이다. 문제에서 주어진 변수들의 범위는 5 ≤ n ≤ 1,000,000과 1 ≤ cmd의 원소 개수 ≤ 200,000이다. 명령어 'U' 또는 'D'가 입력되었을 때, 주어진 숫자 X만큼 이동하는 것이 핵심이다. 이때, 삭제된 행으로 이동하는 것은 이동했다고 간주하지 않기 때문에, 배열로 선언하여 순차 탐색으로 포인터를 움직인다면 주어진 X보다 더 많이 반복문을 돌며 포인터를 이동해야하기 ..
SaveAll()의 사실과 오해
·
JPA
JPA의 SaveAll()은 벌크 연산일까?Spring Data JPA는 기본적으로 saveAll() 메서드를 제공한다. 이름에 붙은 all() 때문에 흔히 한 번의 쿼리로 여러 건을 삽입하는 벌크 연산으로 오해하는 경우가 많지만, 실제로는 그렇지 않다.실제 로그를 확인해 보면, saveAll()을 통해 여러 건의 데이터를 저장할 때 엔티티 개수만큼 insert 쿼리가 발생한다. 즉, 단일 쿼리로 묶어서 처리하지 않고, 컬렉션을 순회하며 엔티티마다 개별 쿼리를 실행하는 것이다.단건 쿼리의 반복이 가지는 문제점이처럼 여러 개의 데이터를 각각 insert로 실행하면 네트워크 왕복 횟수가 데이터 개수만큼 증가하게 된다. 이 과정에서 불필요한 통신 비용이 발생하고, 대량 데이터를 다룰 경우 응답 속도가 느려지는..
우당탕탕 서브모듈 도입기
·
끄적끄적
안녕하세요. 한끼족보 서버 개발자 김가연입니다.저희 한끼족보 서버 팀은 서버를 구축하기 위해 Spring Framework를 사용하고 있는대요, Spring에서는 애플리케이션의 설정 정보를 관리하는 파일이 있습니다. 바로 resoures폴더의 application.yml 파일입니다. DB와 연동하기 위한 비밀번호, 키 값과 외부 API를 이용하기 위한 API Secret 키 등 외부에 그대로 노출되어서는 안되는 기밀 정보들이 application.yml에 포함됩니다. 이러한 중요한 기밀 정보가 만약 Public Git 저장소에 노출되어 악용된다면 어마어마한 서비스 비용이 부과되는 등 매우 위험한 상황으로 이어질 수 있습니다.때문에 만약 Git을 사용하여 협업을 한다면 application.yml 파일은 ..
[BOJ] 행성 터널 (Java) - 플레티넘 5
·
자료구조&알고리즘
문제 링크https://www.acmicpc.net/problem/2887고민한 점문제에서 N개의 행성과 N-1개의 간선, 모든 행성이 연결되도록, 최소 비용 이 3가지 키워드를 보면 최소 스패닝 트리 (MST) 문제구나! 라는 것이 쉽게 파악 된다.다만, 주어진 N의 최대 범위는 100000 으로, 만약 모든 간선을 구하여 풀고자 한다면, 최대 간선의 개수는 $100000C2$로 시간 초과에 더해 메모리 초과까지 발생할 것이다. 때문에 두 행성 간의 터널 비용을 모두 구하는 단순한 방식으로는 이 문제를 해결할 수 없다.간선의 개수를 줄여보자.크루스칼 알고리즘 플로우를 살펴보면, 간선의 비용이 작은 간선부터 연결하여 연결된 간선의 총 개수가 n-1개가 될때까지 두 노드를 union하는 로직이다. 즉, 간..
페이지네이션, Offset vs Cursor
·
데이터베이스
페이지네이션페이지네이션은 대량의 데이터를 한 번에 보여주지 않고, 일정 단위로 나누어 제공하는 방식이다. 사용자 경험을 향상시키고, 서버와 데이터베이스에 가해지는 부하를 줄이기 위해 거의 모든 서비스에서 사용된다. 흔히 게시판 목록이나 검색 결과 화면, 쇼핑몰 상품 리스트 등에서 자주 볼 수 있는 기능이다.필요성데이터가 많아질수록 한 번의 요청에서 모든 데이터를 조회하는 것은 여러 문제를 발생시킨다. 사용자는 너무 많은 데이터를 스크롤해야 하기 때문에 불편을 겪게 되고, 서버 입장에서도 대량의 데이터를 한 번에 처리해야 하므로 데이터베이스 부하나 네트워크 트래픽 증가와 같은 성능 문제가 발생한다. 따라서 많은 데이터를 다뤄야 하는 기능에서는 성능과 사용자 경험을 모두 고려하기 위해 페이지네이션은 필수적인..