
1. 이미지 다운로드이미지를 다운로드 할 때 Dockerhub에서 이미지를 다운 받는다.Github에 사람들이 코드를 저장해두고 clone, pull을 통해 사용하듯이 Dockerhub도 사람들이 올려놓은 이미지들이 저장되어 있어서 pull을 통해 다운 받아서 사용할 수 있다.즉 Dockerhub는 Github처럼 이미지를 저장하고 다운받을 수 있는 저장소 역할을 한다.1.1 최신 버전 이미지 다운로드 명령어docker pull 이미지명 # docker pull 이미지명:latest 와 동일1.2 특정 버전 이미지 다운로드 명령어docker pull 이미지명:태그명태그명은 특정 버전을 나타내는 이름이다.예를 들어 dockerhub에서 nginx 이미지를 다운받는다고 했을 때 아래와 같이 다운 받을 수 있..

Docker를 사용하는 이유Docker를 사용하게 되면 여러가지 장점이 있지만, 그 중에서 가장 큰 장점은 이식성이다. 예를 들어, 학교에서 MySQL로 실습을 하는 수업을 한다고 하자.누군가는 Window를 사용할 수도 있고, 다른 누군가는 Mac을 사용할 수 있다. 또한 같은 운영체제라도 컴퓨터 환경이 다르다.MySQL을 설치해서 실습을 해야 하는데 각 컴퓨터의 환경이 다르기 때문에 같은 방식으로 설치를 하더라도 충돌이나 다양한 이유로 MySQL 설치가 안 될 수 있다. 이 문제를 해결해주는 도구가 Docker이다.간단하게 정리해보면 아래와 같은 장점이 있다.매번 귀찮은 설치 과정을 일일이 거치지 않아도 된다.항상 일관되게 프로그램을 설치할 수 있다.각 프로그램이 독립적인 환경에서 실행되기 때문에 프..

ServletContext의 Attribute에서 List 값을 다운 캐스팅해서 가져올 때 Unchecked Warning이 발생했는데 이 경고를 해결하는 두 가지 방법을 소개해보겠다.1. Unchecked Warning 원인1.1 제네릭과 타입 소거Unchecked Warning은 주로 제네릭과 관련해서 발생한다. 제네릭은 컴파일 타임에만 타입을 유지하고 런타임에는 타입이 소거된다.이로 인해 컴파일 타임에는 타입 안전성을 보장하더라도 런타임에서는 이를 보장하지 못하게 된다.1.2 주요 원인은 Object로 저장해서 제네릭 타입으로 다운 캐스팅을 해야할 때반환 타입이 Object이므로 특정 타입으로 캐스팅할 때 컴파일러는 타입 안전성을 검증할 수 없다. 왜냐하면 런타임에는 제네릭이 소거되기 때문이다.아래..

얼마전 서블릿 컨테이너 초기화에 대해 공부했다.그리고 NHN Academy에서 진행했던 서블릿 기반 쇼핑몰을 다시 만들면서 스프링에서 서블릿 컨테이너 초기화를 어떻게 진행하는지 찾아보았다.코드가 그렇게 길지는 않아서 코드 첨부 후에 이어서 경험을 공유해보겠다.@HandlesTypes(WebApplicationInitializer.class)public class SpringServletContainerInitializer implements ServletContainerInitializer { @Override public void onStartup(@Nullable Set> webAppInitializerClasses, ServletContext servletContext) ..

옛날에 NHN Academy 부트캠프에서 Servlet과 JSP로 쇼핑몰을 만드는 프로젝트를 진행했었다.당시에는 주어진 TODO를 채우면서 Servlet을 설정하고 FrontController의 형태를 구현하는 방식으로 프로젝트를 진행했다.하지만 여러 이유로 완성하지는 못했고, 이후에 완성하려 했지만 관련 자료를 잃어버려서 하지 못했다. 그래서 공부했던 기록을 다시 남겨둘 겸 그 프로젝트를 다시 시작하려고 한다.과거의 아쉬움을 채우는 데 그치지 않고 더 발전된 방식으로 만들어보는 것이 목표다.이번에는 나만의 방식으로 조금 더 스프링의 DispatcherServlet의 형태를 만들어 볼 것이고 여러 방면에서 스프링의 철학을 담아보려고 한다.(이미 진행중이라서 느끼는건데 스프링을 모방하는 것은 쉽지 않고, ..

Spring 애플리케이션에서 객체를 관리하는 핵심은 Spring 컨테이너이다.Spring 컨테이너는 Bean을 생성하고 관리할 때 @Configuration 어노테이션을 함께 사용한다.@Configuration 어노테이션은 싱글톤을 보장하면서 Bean들 사이의 의존성 주입을 해준다.이 글에서는 @Configuration이 필요한 이유에 대해서 설명해보겠다.@Configuration이란?@Configuration은 클래스가 Spring 컨테이너에 Bean을 등록하기 위한 클래스임을 나타낸다. 주요 특징Bean 등록 및 관리: @Bean 메서드를 통해 Bean을 정의한다.Singleton 보장: 컨테이너는 동일한 @Bean 메서드 호출 시 항상 같은 객체를 반환한다.의존성 관리: Bean 간의 의존성을 명확..

BeanFactory와 ApplicationContext의 기본 계층 구조BeanFactory스프링 컨테이너의 최상위 인터페이스다.스프링 bean을 관리하고 조회하는 역할을 담당한다.지연 로딩(Lazy Loading)Bean을 실제로 요청할 때(getBean() 호출 시) 생성하고 초기화한다.이는 초기 로딩 속도를 빠르게 하고, 메모리 사용을 최적화할 수 있다.ApplicationContextBeanFactory의 기능을 포함해서 여러 기능을 가지고 있는 BeanFactory의 하위 인터페이스이다.즉시 로딩컨텍스트 초기화 시점에 모든 Bean을 미리 생성하고 초기화한다.이는 애플리케이션 시작 시점에 모든 Bean의 상태를 확인할 수 있어 런타임 오류를 사전에 방지할 수 있다.그러나 필요하지 않은 Bean..

웹 애플리케이션 개발에서 서블릿 컨테이너 초기화는 필수적인 과정이다.서블릿 컨테이너는 애플리케이션 실행 시점에 초기화 작업을 수행하여 서블릿, 필터, 리스너 등을 등록한다.이 글에서는 서블릿 컨테이너 초기화의 전반적인 구조와 이를 기반으로 스프링 레거시와 스프링 부트에서 각각 어떻게 처리하는지 살펴보겠다.1. 서블릿 컨테이너 초기화의 기본 방법1.1 ServletContainerInitializer1.1.1 정의서블릿 3.0 스펙에서 제공하는 ServletContainerInitializer는 서블릿 컨테이너 초기화를 담당하는 표준 인터페이스이다.웹 애플리케이션이 시작될 때 서블릿 컨테이너(Tomcat, Jetty 등)는 이 인터페이스를 구현한 클래스를 자동으로 탐색하고 실행한다.public interf..

1. WAS(Web Application Server)란?WAS(Web Application Server)는 웹 애플리케이션을 실행하고 관리하는 미들웨어다.클라이언트 요청 -> 애플리케이션 로직 실행 -> 결과 반환의 과정을 담당자바/스프링 기반의 경우 WAS를 서블릿 컨테이너라고 봐도 무방주요 예시 : Tomcat, Jetty 등1.1 WAS의 주요 기능멀티 쓰레드 처리많은 클라이언트 요청을 동시에 처리하기 위해 내부적으로 쓰레드를 관리트랜잭션 관리여러 작업(쿼리, 로직)이 하나의 논리적 단위로 묶였을 때, 데이터 무결성과 일관성을 보장WAS에서 트랜잭션 환경을 제공(JNDI 데이터 소스 등)할 수 있지만, 실제 트랜잭션 처리는 보통 애플리케이션 레벨(Spring Framework 등)에서 관리하는 경..

스프링부트는 @ConfigurationProperties를 통해 외부 설정을 객체로 바인딩해서 관리하는 기능을 제공한다.이를 활용하면 설정값을 타입 안전하게 사용할 수 있고, 유지보수성이 크게 향상된다.이번 글에서는 @ConfigurationProperties의 개념, 사용법, 검증에 대해 알아보겠다.1. @ConfigurationProperties란?1.1 개념과 장점@ConfigurationProperties는 외부 설정값을 자바 객체에 자동으로 바인딩하는 기능을 제공한다.이를 통해 설정 파일의 값을 일괄적으로 객체에 매핑할 수 있으며, 타입 안전성을 보장한다.장점타입 안전성: 설정값이 객체 필드와 타입에 맞게 바인딩된다.일괄 바인딩: 설정값을 하나의 객체로 묶어서 관리할 수 있다.유지보수성 향상: ..

스프링 레거시와 스프링 부트는 외부 설정 파일(Properties와 Yaml)을 관리하고 활용하는 방식에서 차이점이 있다.이 글에서는 각각의 설정 파일 활용법과 자동 설정 기능, 우선순위 비교를 통해 두 방식의 차이점을 자세히 알아보겠다.1. 스프링 레거시에서 Properties 사용하기스프링 레거시에서는 .properties 파일을 사용해 설정값을 관리할 수 있으며, @PropertySource를 통해 이를 등록해야 한다.1.1 @PropertySource와 @Value를 사용한 값 조회@PropertySource와 @Value사용하면 .properties 파일을 읽고 스프링 Environment에 등록할 수 있다.import org.springframework.context.annotation.Con..

스프링은 다양한 외부 설정 값을 통합적으로 관리하기 위해 Environment와 PropertySource라는 개념을 제공한다.이를 통해 OS 환경 변수, 자바 시스템 속성, 커맨드 라인 옵션 인수, 그리고 설정 파일 등 다양한 외부 설정 값을 하나의 인터페이스로 관리할 수 있다.이번 글에서는 스프링의 외부 설정 통합 관리 구조와 동작 원리를 알아보겠다.1. 스프링의 외부 설정 통합스프링은 외부 설정을 Environment와 PropertySource를 통해 추상화하여 관리한다.이를 통해 개발자는 외부 설정 값을 동일한 방법으로 읽을 수 있다.1.1 Environment 인터페이스 개념Environment는 스프링에서 설정값을 통합적으로 관리하는 추상화 인터페이스이다.역할: 다양한 외부 설정 값을 키-값..