분류 전체보기
[Spring Boot] 외부 설정
[Spring Boot] 외부 설정
2023.05.28개발한 애플리케이션을 실행할 때는 개발 / 로컬 / 운영 환경으로 나눠서 실행하고, 환경마다 사용하는 데이터베이스나 기타 설정을 다르게 설정한다. 변하는 환경 값들을 실행하는 시점에서 외부에서 넣어 주는 방식을 사용하는 편이 합리적이다. 대부분 애플리케이션 빌드는 한 번만 하고, 애플리케이션을 실행할 때 설정 정보를 외부에서 넣어 주는 방식을 사용한다. 외부 설정으로는 크게 4가지 방법이 있다. 1. OS 환경 변수 : 운영체제에서 제공하고, 해당 운영체제를 쓰는 모든 프로세스에서 사용된다. System.getenv() 메서드로 Map을 반환받고 OS가 제공하는 환경 변수를 출력할 수 있다. 데이터베이스 접근 URL을 OS의 환경 변수에 설정해두고 애플리케이션 실행 시 읽어들이는 방식을 사용할 수 있다...
[Spring Boot] 자동 구성
[Spring Boot] 자동 구성
2023.05.26DB에 회원을 저장하고 관리하려면 JdbcTemplate, DataSource, TransactionManager 등 데이터베이스 관련 여러 빈들이 사용된다. 스프링 부트는 자동 구성 기능을 사용해 자주 사용하는 빈들을 자동으로 등록해준다. spring-boot-autoconfigure 프로젝트 내부에서 자동 구성 관련 정보를 확인할 수 있다. (spring-boot-starter 라이브러리를 추가할 때 등록된다) @AutoConfiguration(after = DataSourceAutoConfiguration.class) @ConditionalOnClass({ DataSource.class, JdbcTemplate.class }) @ConditionalOnSingleCandidate(DataSource..
[Spring Boot] 라이브러리의 선택과 버전 관리
[Spring Boot] 라이브러리의 선택과 버전 관리
2023.05.23스프링으로 애플리케이션을 만들 때 아무것도 없는 처음부터 시작하지는 않는다. 미리 작성된 라이브러리들을 불러와서 적절하게 사용하는 방식으로 애플리케이션을 작성하는데... 적절한 라이브러리를 찾았다고 해서 무조건 정상적으로 작동한다는 보장은 없다. 라이브러리를 구축할 때 서로 충돌이 발생하지 않도록 버전 관리도 해 줘야 하고, 새로운 버전이 나오면 라이브러리를 따로 업데이트 해 줘야 한다. 스프링 부트는 라이브러리의 버전을 관리해준다. 개발자는 필요한 라이브러리를 고르기만 하면 되고, 스프링 부트가 사용하는 라이브러리들의 버전을 알아서 관리한다. (최적화 된 버전을 사용한다) dependency-management 플러그인을 사용하면 spring-boot-dependencies 의 bom (bill of ..
[Spring Boot] 부트와 내장 WAS
[Spring Boot] 부트와 내장 WAS
2023.05.22웹 서버와 웹 애플리케이션 서버에 대해 제대로 알고 넘어가자. 웹 서버는 HTTP 프로토콜로 들어오는 클라이언트의 요청을 받아 처리하는 역할을 수행한다. (Apache, Nginx) 웹 애플리케이션 서버 (WAS) 도 클라이언트의 요청을 받아 동적인 컨텐츠를 제공한다. (Tomcat, Express, Django..) 웹 서버는 페이지를 렌더링 할 때 필요한 정적인 컨텐츠와 로드밸런싱, SSL 암호화 등을 빠르게 제공하고 웹 애플리케이션 서버는 동적인 컨텐츠를 제공한다. 스프링 애플리케이션은 WAS 위에서 실행되고, 웹 서버를 앞에 두고 웹 서버를 통해 클라이언트의 요청을 전달받고 요청을 처리하는 방식을 자주 사용한다. 클라이언트가 웹 서버에 HTTP 요청을 보내면 웹 서버가 정적 컨텐츠 요청인지 동적 ..
[Spring Boot] 스프링과 웹 서버
[Spring Boot] 스프링과 웹 서버
2023.05.21부트를 사용하기 전 웹 애플리케이션을 배포하려면 WAS를 따로 설치해 주고 해당 WAS에서 잘 동작하도록 서블릿 스펙에 맞춰 코드를 작성한 후 WAR로 패키징해서 WAS의 배포 디렉토리에 WAR파일을 전달해 줘야 했다. 부트는 이런 작업을 자동화한다. Tomcat (WAS) 을 기본적으로 포함하고 있어 작성한 자바 코드를 빌드한 jar파일을 실행해주기만 하면 애플리케이션이 실행된다. (jar는 메인 메서드가 있다) 자바는 여러 클래스와 리소스들을 묶어서 JAR (Java Archieve) 압축 파일을 만들 수 있다. JAR 로 패키징 된 파일은 JVM에서 직접 실행되거나 다른 애플리케이션의 라이브러리로 사용될 수 있다. (직접 실행되는 경우 메인 메서드가 있어야 하고, MANIFEST 파일에 실행할 메인..
[eGovFramework] 표준프레임워크 개요
[eGovFramework] 표준프레임워크 개요
2023.05.15지금이야 애플리케이션 개발할 때 웹 개발 방식을 많이 사용하지만, 이전에는 exe파일을 배포하는 C/S 방식과 단말기를 통해서 서비스를 제공받는 메인프레임 방식으로 개발을 진행했었고, 그보다 더 이전에는 어셈블리언어를 통해 하드웨어를 개발했었다. 어셈블리 -> 절차지향 -> 객체지향 -> 프레임워크 사용하는 개발 도구의 흐름은 위와 같다. 공통되는 부분을 따로 빼고, 중복되는 부분을 쉽게 재사용 하기 위해 위와 같이 변화해왔고 그 결과 프레임워크가 도입됐다. 프레임워크는 애플리케이션 개발의 구조와 틀을 제공한다는 점에서 라이브러리와 다르다. 자동차에 비유하자면 라이브러리는 핸들, 엔진 등 특정 기능을 제공한다. 프레임워크는 자동차의 큰 틀을 제공한다. 컴포넌트는 자동차의 표준화 된 기능을 제공해 프레임워..
[Spring Boot] 스프링 부트의 도입
[Spring Boot] 스프링 부트의 도입
2023.05.14스프링 부트는 스프링을 편하게 사용할 수 있도록 지원한다. 자바로 애플리케이션을 편하게 만들기 위해 스프링이 도입됐고, 스프링을 편하게 사용하기 위해 스프링 부트가 도입됐다. 스프링 부트는 스프링에서 설정해야 되는 여러 요소들을 자동화하고 Best Practice를 사용할 수 있도록 설계되어있다. 아래는 부트가 자동화하는 주요 기능이다. (많은 기능 중 주요 기능이다) 스프링 부트는 스프링 부트로, 부트가 아닌 스프링은 스프링으로 서술한다. 1. WAS 내장 스프링 부트는 Tomcat을 내장하고 있어 스프링 프로젝트를 다룰 때 처럼 Tomcat을 따로 설치할 필요가 없다. 스프링과는 다르게 메인 메서드가 있어 메인 메서드를 실행하면 내장된 WAS를 실행하게 된다. 2. 라이브러리 관리 애플리케이션 개발에..
[Spring 3.1] 스프링 MVC와 웹 기술 - 핸들러
[Spring 3.1] 스프링 MVC와 웹 기술 - 핸들러
2023.05.13스프링은 웹 기술에서 독립적인 루트 애플리케이션 컨텍스트와 웹 기술 기반으로 동작하는 서블릿 애플리케이션 컨텍스트 두 가지로 애플리케이션 컨텍스트를 분리해서 구성한다. (계층 구조로 구성돼 서블릿 애플리케이션 컨텍스트는 루트 애플리케이션 컨텍스트에 접근할 수 있다) 루트 애플리케이션 컨텍스트에서는 서비스, 리포지토리 등 웹과 관련된 기능을 제외한 모든 빈을 관리하고, 서블릿 애플리케이션 컨텍스트에서는 핸들러 매핑, 뷰 리졸버 등 웹과 관련된 빈들을 관리한다. 배치 작업 등 웹과 관련되지 않은 애플리케이션은 웹 관련 빈들을 관리하는 서블릿 애플리케이션 컨텍스트가 필요하지 않다. 이렇게 애플리케이션을 두 개로 분리하면 서블릿 애플리케이션 컨텍스트를 다른 기술로 교체하거나 제거할 수 있어 애플리케이션을 효과적..
[Spring 3.1] 데이터 엑세스 기술
[Spring 3.1] 데이터 엑세스 기술
2023.05.11스프링은 보통 JDBC API를 사용해 데이터베이스와 연결해서 동작하고, 데이터 접근을 위한 여러 가지 추상화와 통합 기술을 지원한다. JPA, Spring Data JPA, MyBatis 등... 데이터 엑세스 관련 다양한 기술들이 있지만, 모두 내부적으로 JDBC API를 사용하고 있다. (추상화 되어 있어 개발자는 해당 기술이 JDBC API를 사용하고 있는지 알 필요는 없다) 100명의 사용자가 스프링으로 구축한 서버에 접속한다고 생각해 보자. 스프링 애플리케이션은 실행될 때 미리 빈들을 등록하고 주입하는 역할을 수행하고, 미리 주입된 빈들을 사용해서 사용자의 요청을 처리한다. 주입된 빈의 스코프가 싱글톤이라고 해 보자. 싱글톤 스코프를 가지는 빈은 애플리케이션 컨텍스트 내부에서 한 번만 생성하고..
[Spring 3.1] IoC 컨테이너와 스프링의 동작 원리
[Spring 3.1] IoC 컨테이너와 스프링의 동작 원리
2023.05.10DI 구현을 통한 IoC는 스프링이 제공하는 대표적인 기능 중 하나이고, DI 설정 방식과 IoC 컨테이너의 활용 방법은 매우 다양하다. 스프링은 오브젝트를 코드로 관리하는 대신 독립된 컨테이너가 관리하도록 해 IoC를 구현한다. 해당 컨테이너는 오브젝트의 생성과 주입을 포함한 여러 가지 기능을 포함하고, 이 컨테이너를 애플리케이션 컨텍스트라고 부른다. (빈 팩토리는 DI 작업을 하는 컨테이너만을 부르고, 애플리케이션 컨텍스트는 다른 기능이 추가된 컨테이너이다) 빈 팩토리는 빈의 생성, 초기화, DI 등 생명주기를 담당하고 팩토리 빈은 복잡한 생성 로직이 필요한 빈을 만들 때 빈의 생성 과정을 완전하게 제어할 때 사용한다. 빈 팩토리를 확장해서 애플리케이션 컨텍스트 (IoC 컨테이너) 로 사용하고, 팩토..
[Spring 3.1] Annotation
[Spring 3.1] Annotation
2023.05.04Java 5 버전에서 애너테이션이 등장하고 스프링 3.1 버전부터는 애너테이션을 사용해 메타 정보를 작성하는 방식을 사용해 xml을 사용하는 경우가 많이 줄어들었다. 애너테이션은 작성하는 코드에 비해 부가적으로 얻을 수 있는 정보가 많아 애플리케이션의 코드를 간추릴 수 있다. 당장 @Transactional 애너테이션만 생각해도 그렇다. 별도의 트랜잭션 관련 설정 없이 애너테이션 하나로 트랜잭션 관련 설정을 모두 진행할 수 있다. 이렇듯 애너테이션이 사용되는 정책과 관례를 잘 이해하고 있다면 애너테이션을 사용해 코드를 간결하게 작성할 수 있다. xml을 사용하든 애너테이션을 사용하든 스프링이 동작하는 핵심 원리는 변하지 않는다. 단, 어떤 방법을 사용하든 그 방법이 어떻게 핵심 원리를 구현하는지 이해하고..
[Spring 3.1] Aspect Oriented Programming
[Spring 3.1] Aspect Oriented Programming
2023.04.28Service 계층에서 비즈니스 로직과 트랜잭션 설정 관련 로직을 분리했지만, 여전히 트랜잭션 경계 설정을 위해 비즈니스 로직의 앞뒤로 관련된 코드가 붙어 있는 상황이다. 두 부분을 분리할 수는 없을까? Service 계층에는 비즈니스 로직만 포함하면 좋을 텐데.. Service 계층을 인터페이스로 설계하고 두 가지 클래스를 구현 클래스로 설정해보자. 하나는 비즈니스 관련 로직만을 다루고, 나머지 하나는 트랜잭션 관련 설정 로직만을 다룬다. ServiceTx 구현체에서는 ServiceImpl에게 작업을 위임한다. 트랜잭션 관련 설정은 알아서 처리하고, 비즈니스 관련 로직을 처리해야 하는 경우 ServiceImpl을 DI 받아서 해당 구현체가 처리하도록 설계한다. 작업을 거듭할수록 Service 계층이 점..