728x90

Spring 25

Spirng(스프링) - 싱글톤 컨테이너

웹 애플리케이션과 싱글톤 웹 애플리케이션은 보통 여러 사용자가 동시에 요청을 함 동시 요청시 때 마다 매번 객체를 생성하지 않음 순수한 DI 컨테이너는 객체를 호출할 때 마다 계속해서 생성 => 과도한 트래픽이 발생할 경우 메모리 낭비 심함 => 싱글톤을 이용해 1개만 생성하여 공유 하도록 함 싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 일반적으로 static 영역에 instance를 미리 하나 생성하여 올려두고 getter를 통해서만 받을 수 있게 한다. 혹시라도 생성하지 못하게 생성자는 private으로 막는다. 스프링 컨테이너는 모든 빈 객체를 싱글톤 패턴으로 관리 함 #문제점 구현하는데 코드 자체가 많이 들어감 DIP 위배 (구체 클래스에 의존) OCP 위배할 가..

Spring(스프링) - 스프링 컨테이너와 스프링 빈

스프링 컨테이너 - ApplicationContext 인터페이스이며 스프링 컨테이너라고 함 자바기반과 XML 기반으로 생성할 수 있음 스프링 컨테이너가 생성되면서 내부에 빈 저장소가 생성 스프링 컨테이너 생성시 구성정보를 전달 해야 함 (AppConfig.class) 스프링 컨테이너 생성 되면서 @Bean 어노테이션이 등록된 메서드를 모두 호출하여 Bean 객체를 등록 => 이때 의존관계가 설정 됨 빈 객체 name은 모두 다르게 설정 해주어야 함 스프링 빈 ApplicationContext에서 getBean을 통해 가져올 수 있음 빈이름,타입 혹은 타입으로 가져올 수 있음 상속관계에 의한 부모 - 자식관계에서 부모타입을 조회하면 자식타입까지 같이 조회가 됨 최상위인 Object를 조회할 경우 모든 스프..

Spring(스프링)을 위한 사전 지식

- 스프링의 핵심 스프링은 자바 언어 기반의 프레임워크 객체 지향의 특징을 살린 프레임워크 객체지향은 메시지를 주고 받고 데이터를 처리할 수 있는 객체들의 모임으로 구성하는 것 객체지향 프로그래밍은 유연하고 변경이 용이 - 객체지향 특징 #추상화 공통적으로 가진 속성이나 기능을 추출하여 표현 한 것 #캡슐화 직접적으로 접근이 불가하며 제공하는 함수를 통해 사용할 수 있으며 캡슐처럼 내부를 보호하고 있는 특성 #상속 부모의 기능을 자식이 물려받아 재사용하거나 재구성하여 사용하는 특성 #다형성 역할과 구현으로 구분 ex) 자동차 역할 [역할] - K3, 아반떼, 테슬라 모델3 [구현] 클라이언트는 내부구조를 몰라도 되며, 구조가 변경되어도 영향을 받지 않음 자바에서는 역할(인터페이스), 구현(인터페이스를 구..

예외 처리

익셉션 - 잘못된 프로그램 조작 혹은 프로그램의 오류에 의해 발생합니다. #에러 VS 익셉션 - 에러는 JVM 하단에서 발생해 하드웨어 OS 문제로써 프로그램이 중단됩니다. - 익셉션은 JVM 위에서 어플리케이션 문제에 의해 발생하고 처리에 따라 프로그램이 중단 할 수도 있고 안할 수 도있습니다. 호출된 메서드의 정상 실행과 비정상 실행 #정상 실행 - return문을 반환하거나 공유변수를 통한 반환 혹은 호출시 넘겨 받은 참조값이 가리키는 객체를 통해 반환을 합니다. 비정상 실행 - 호출된 메서드에서 익셉션이 발생하게 됩니다. - new로 익셉션 객체를 생성 및 throw 로 생성된 객체를 던집니다. - 자기 자신이 처리할 경우 try-catch를 이용해 직접 처리합니다. - 자기 자신이 아닌 자신을 ..

Spring - 검증 객체와 에러코드

Validator를 직접 구현하여 객체를 수동 생성하여 동작 검증 객체를 커맨드 객체별로 따로 생성합니다. Vaildator 인터페이스를 구현하는 객체를 생성하는데 supports()메소드는 해당 커맨드 객체를 검증할 수 있는지 없는지 구분하는 메소드입니다. 하지만 수동으로 생성할 경우 개발자가 직접 넣기 때문에 확인이 필요 없습니다. vaildate()메소드는 커맨드 객체를 검증하는 메소드입니다. 여러개의 객체 검증을 위해 Object 와 에러코드를 담기 위한 Error를 매개변수로 가집니다. Object로 커맨드 객체를 받아와 메소드 내부에서 다운 캐스팅하여 사용합니다. 각 커맨드 객체의 프로퍼티들을 검사하여 올바르지 않다면 error객체의 rejectValue()메소드를 통해 문제있는 프로퍼티와 에..

Spring - 메시지 처리

내용 설정시 두가지 방법이 있습니다. 1. Model 객체 안의 내용을 request 객체를 사용하여 직접 사용 2. Model 객체로 컨트롤러에서 제공하는 것이 아닌 것들을 하드코딩하지 않고 로 처리 보통 스프링에서 메시지 처리는 다국어 처리때 많이 사용됩니다. 먼저 언어별로 번들파일을 언어코드를 붙여 프로퍼티스 파일로 만들고 번들파일을 관리하는 폴더 생성합니다. 이 번들파일을 를 사용하여 가지고 오는데 이 태그는 MessageSource Bean객체를 사용하여 가져옵니다. 우선 스프링 설정 클래스에서 MessageSource를 Bean 객체로 등록 합니다. MessageSource 객체는 ResourceBundleMessage 객체를 사용해 basepackage와 인코딩을 설정합니다. basepack..

Spring - 커맨드 객체

커맨드 객체를 이용한 요청 파라미터 처리 커맨드 객체는 요청 파라미터가 담긴 데이터 객체입니다. 요청 파라미터가 많을 수록 코드가 길어지기 때문에 커맨드 객체를 사용합니다. 커맨드 객체는 요청 파라미터를 받을 수 있게 setter를 포함하는 객체이며 스프링은 이 setter를 이용해 요청 파라미터를 전달합니다. 커맨드 객체가 요청 매핑 어노테이션이 적용된 요청 처리 메소드의 파라미터에 존재하면 요청 파라미터의 이름과 커맨드 객체의 프로퍼티 이름이 같은 것들에 대해 setter를 이용해 핸들러 어댑터가 자료형 변환을 시켜 set 시켜줍니다. 뷰 페이지에서 커맨드 객체 이용 스프링 MVC는 커맨드 객체를 자동적으로 Model 객체에 넣습니다. 이때 키 값은 커맨드 객체의 이름에 첫글자를 소문자로 한 값이 됩..

Spring - 요청 경로 매핑과 요청 파라미터, 리다이렉트

요청 매핑 어노테이션을 이용한 경로 매핑 @Controller 를 이용한 컨트롤러를 통해 요청을 처리하는데 요청 매핑 어노테이션을 사용해 수행할 요청 경로를 지정합니다. @RequestMapping, @GetMapping, @PostMapping을 사용합니다. 여러개 사용이 가능하며 경로가 겹칠 경우 @RequestMapping으로 공통 경로를 지정한 후 각각 메소드에서 세부적으로 지정하여 따로 관리할 수 있습니다. 요청의 구분(Get,Post) 스프링 MVC는 별도 설정이 없으면 @RequestMapping에 지정된 경로를 매핑하고 @GetMapping/@PostMapping의 경우에는 해당 요청 방식에 대해서 처리합니다. 같은 경로여도 요청방식에 따라 다른 메소드를 수행 시킬 수 있습니다. 같은 경로..

Spring - AOP

AOP : 핵심 기능과 공통 기능의 구현을 분리함으로써 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용할 수 있게 해주는 기법입니다. AOP 공통 기능 삽입 방법 3가지 1. 컴파일 시점에 코드에 공통 기능 삽입 2. 클래스 로딩 시점에 바이트 코드에 공통 기능 삽입 3. 런타임에 프록시 객체를 생성하여 공통 기능 삽입 스프링에서는 3번 방법을 사용하고 자동으로 프록시 객체를 생성합니다. AOP를 설정하는데 필요한 어노테이션을 사용하기 위해 aspectjweaver모듈을 추가하고 aop는 spring-aop모듈이 제공하며 spring-context에 의존되어져 있으므로 추가해줄 필요가 없습니다. 공통기능 객체 : 핵심 기능의 실행은 다른 객체에 위임하고 부가적인 기능을 제공하는 객체 대상 객체 :..

Spring - Bean라이프사이클과 스코프

Bean 객체의 라이프 사이클 Bean 객체는 크게 생성, 의존주입, 초기화, 소멸에 대한 라이프 사이클을 가지게 됩니다. 컨테이너의 생성과 소멸에 연관되어져 있으며 컨테이너 생성시에 Bean 객체를 생성하고 의존을 주입하고 초기화 하는 과정을 거칩니다. 컨테이너 소멸시 Bean객체를 소멸하는데 이때 싱글톤 타입이 아닌 프로토 타입의 경우에는 자동 소멸 되지 않으므로 명시적으로 소멸 해야합니다. Bean 객체의 생성과 소멸시 InitailizingBean 과 DisposableBean 인터페이스를 구현하여 수행 시킬 수 있는데 afterPropertiesSet()와 destroy() 메소드를 구현하면 됩니다. 이 두 인터페이스를 구현하여 메소드를 사용할 수 없는 경우 커스텀 메소드를 사용하여 구현할 수 ..