분류 전체보기 199

3Sum (Two Pointers)

LeetCode의 3Sum 문제다. 3Sum - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 주어진 수 중에서 3개를 골라 합이 0인 조합을 반환하는 문제인데 중복된 조합은 반환하지 않아야 한다. 정수 배열은 10000개 까지 주어질 수 있기 때문에 최적화되지 않은 코드의 경우 시간 초과가 발생할 수 있다. 실제로 첫 번째로 구현한 아래 코드는 28번째 테스트 케이스에서 시간 초과 에러가 발생했다. class Solution: def threeSum(self,..

Spring의 생성자 의존 주입(Constructor Dependency Injection)

원래는 이전 포스트에서 작성하던 부분이었으나 너무 글이 길어지는 관계로 따로 분리하였다. Spring의 의존성 주입(Dependency Injection) 스프링의 큰 특징 중 하나는 Dependency Injection(DI, 의존성 주입)을 지원한다는 것이다. 의존성 주입 자체는 스프링에 한정된 개념이 아니고 객체 간 관계를 다루는 방법 중 하나인데 일단 의존성이 haruhiism.tistory.com 생성자 주입 위의 포스트에서는 의존성 주입 방법으로 필드 주입, Setter 메서드 주입, 생성자 주입 세 가지 방법을 제시했다. 그중 마지막 방법인 생성자 주입은 말 그대로 객체의 생성자에서 의존하는 Bean 객체를 파라미터로 넘겨받는 방식이다. @Component public class Greete..

Spring의 빈 범위(Bean Scope)

스프링에서 Bean 객체를 생성한다는 것은 실제로는 Bean 객체를 생성하기 위한 일종의 레시피, 클래스를 정의하는 것이다. 이런 레시피를 작성하는 것은 객체의 의존성이나 설정값뿐 아니라 해당 객체의 범위(scope)를 조절할 수 있다는 특징이 있다. 특히 기존 자바 언어의 스코프와는 다른 스프링 프레임워크만의 스코프를 Bean 객체들에게 적용할 수 있는데 스프링에서는 다음과 같은 다섯 가지 스코프를 제공한다. singleton: 해당 객체는 스프링 컨테이너에서 단 하나만 존재한다. prototype: 해당 객체는 스프링 컨테이너에 몇 개든 존재할 수 있다. request: 해당 객체는 web-aware 스프링 컨테이너에 전송된 HTTP 요청마다 생성된다. session: 해당 객체는 web-aware ..

Spring의 빈 생명주기(Bean Lifecycle)

스프링의 컨테이너는 Bean 객체들을 관리한다. 객체들을 관리한다는 것은 단순히 싱글턴으로 제공하거나 필요한 곳에 주입하는 것뿐 아니라 객체의 생성과 소멸, 즉 생명주기(Lifecycle)를 관리한다는 것을 의미한다. 컨테이너와 빈의 생명주기 스프링 컨테이너 자체도 생명 주기가 있다. 간단하게는 다음처럼 ApplicationContext 구현 클래스를 이용하여 초기화하고 close 메서드로 종료하는 것을 예로 들 수 있다. public class Main { public static void main(String[] args){ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class); ..

Spring의 제어 역전 컨테이너(Inversion of Control Container)

스프링 프레임워크의 핵심적인 개념에는 IoC Container, Dependency Injection 등이 있다. Dependency Injection(의존성 주입)은 지난 포스트에서도 몇 번 다뤄봤으니 이번에는 IoC Container, 즉 제어 역전(inversion of control) 컨테이너에 대해 조금 더 조사해보았다. 제어 역전(Inversion of Control, IOC) 제어 역전이라는 것은 의존성 주입과는 다르다. 의존성 주입이 결합도를 낮춰서 프로그램을 좀 더 유연하게 구축하고자 하기 위한 거라면 제어 역전은 소스 코드의 제어를 컨테이너나 프레임워크에 이전하는 소프트웨어 공학 기법이다. 이게 무슨 말이냐면 스프링 프레임워크에서 의존 자동 주입(@Autowired 등)을 할 때 이 의..

Spring의 컴포넌트 스캔(Component Scan)

이전까지는 스프링 설정 클래스(ApplicationContext 등)에서 Bean 객체를 생성, 컨테이너에 직접 등록하여 사용했다. 그러나 컴포넌트 스캔 기능을 사용하면 설정 클래스에서 일일이 등록하지 않아도 여러 클래스의 Bean 객체를 컨테이너에 자동으로 등록할 수 있다. @Component @Component public class MemberRegisterService { ... 이 방법은 Bean 객체를 컴포넌트 클래스에 구현하면 애플리케이션 실행 시 스프링이 컴포넌트 클래스들을 탐색, Bean 객체들을 컨테이너에 등록하는 방법이다. 이를 컴포넌트 스캔(Component Scan)이라 한다. 컴포넌트 클래스는 위처럼 @Component 어노테이션이 붙은 클래스며 이 클래스의 객체가 스프링 컨테이..

Spring의 의존 자동 주입(@Autowired)

이전 포스트에서는 Spring 프레임워크에서 어떤 식으로 DI가 이루어지는지 간략하게 살펴보았다. 의존성을 주입하려면 직접 Bean 객체를 생성하는 메서드를 호출하여 생성자에 전달하거나 Setter 메서드를 사용할 수도 있겠지만 스프링 프레임워크 자체에서 이 의존성을 주입해줄 수도 있다. 이를 의존 자동 주입이라 하며 @Autowired나 @Resource 어노테이션을 사용한다. ... public class ChangePasswordService { @Autowired private MemberDAO memberDAO; ... 간단한 사용은 위와 같다. 그냥 의존 주입이 필요한 대상에게 @Autowired 어노테이션을 붙여주면 된다. 원래는 이 ChangePasswordService 클래스에서 Memb..

블랙커피 레벨1 스터디 6기 참가 후기

지난 몇 주간 NEXTSTEP에서 진행하는 웹 프론트엔드 스터디인 블랙커피 레벨1에 참여했다. 블랙커피 스터디 레벨1 edu.nextstep.camp 이 스터디를 시작했을 때는 이제 막 보안에서 개발로 전향하고 이것저것 공부할 분야를 알아보던 중이라 웹 프론트엔드, 백엔드를 가리지 않고 공부하고 있었는데 그중에서도 공통적으로 사용할 수 있는 자바스크립트(프론트엔드에서는 다양한 라이브러리, 백엔드에서는 node.js)를 공부하다가 친구의 권유로 참가하게 되었다. 스터디는 레벨1이라는 이름만큼 웹 프론트엔드의 기초적인 부분을 다루고 있다. 약 3~4주 정도의 기간 동안 매주 HTML, CSS 소스 코드를 기반으로 특정 기능을 구현하는 자바스크립트를 작성하는 과제를 하면서 서로 코드 리뷰도 하고 기능도 보완하..

참가 후기 2021.02.20

Trapping Rain Water (Two Pointers)

LeetCode의 Trapping Rain Water 문제다. Trapping Rain Water - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 처음으로 건드려보는 Hard 난이도의 문제다. 사실 Medium 문제도 혼자 힘으로 풀기 버거워서 Hard 난이도는 손대지 않고 있었는데 책에서 풀이를 알려주기 때문에 이를 공부하는 셈 치고 풀어보았다. 사실 직접 푼 것도 아니고 해설을 읽고 분석하는 정도지만 나중에 비슷한 문제가 나왔을 때 활용할 수 있을 것이다...