본문 바로가기

프로그래밍/Spring

(8)
패스워드 암호화 패스워드를 왜 암호화해서 저장해야하는가 패스워드는 평문으로 저장하면 안됩니다. 그 이유는 다양하지만 큰 이유는 2가지 정도가 있습니다. 해당 서비스의 관리자가 db에서 모든 사용자의 비밀번호를 볼 수 있으며 db가 털리는 경우 공격자에게 계정 정보가 넘어갈 수 있기 때문 일반적으로 id와 password를 여러곳에서 쓰는 경우가 많아서 추가적인 피해가 발생할 수 있기 때문입니다. PasswordEncoder 스프링 시큐리티에서 비밀번호를 암호화 하도록 단방향 해시를 위한 PasswordEncoder 인터페이스와 구현체들을 지원하는데 그중에서 BcryptPasswordEncoder에대해 알아봅시다. BcryptPasswordEncoder Bcrypt 해시함수를 사용하여 패스워드를 암호화를 할 수 있습니다...
Errors나 BindingResult사용시 주의할 점 스프링의 유효성 검사 스프링에서는 import org.springframework.validation.Validator 인터페이스를 통해 객체 검증이나 에러 메세지등을 지원한다. 컨트롤러에서 객체의 값을 검증할 때 Validator 인터페이스를 구현하여 유효성 검사를 하는데 주의할 점이 있다. BindingResult나 Errors는 바인딩 받는 객체의 바로 다음에 선언해야 된다. 이를 인지하지 않은 상태로 구현을 작성하여 BindException이 발생하였던 내용을 정리하였다. org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors현상 내가 예상했던 동작은 ..
스프링 부트의 오류처리(Error Handling) 기본적으로 스프링 부트는 모든 에러를 처리하는 /error 매핑을 제공하며 서블릿 컨테이너에 전역 오류페이지로 등록한다. 머신 클라이언트의 경우는 오류, http 상태 exception메세지를 json으로 응답하며 브라우저 클라이언트에서는 동일한 데이터를 html 포맷으로 렌더링하는 "whitelabel" 에러 뷰를 보여준다. Browser Client Machine Client BasicErrorController 스프링 부트는 BasicErrorController에서 에러핸들링을 하고있다. 생성자와 stacktrace, errors, message속성에대한 결정을 하는 메서드들은 생략하였다. @Controller @RequestMapping("${server.error.path:${error.path..
스프링부트의 자동설정 스프링부트의 자동설정 스프링 부트에서는 어떻게 스프링에서 오래 걸렸던 초반 환경설정 없이 바로 동작이 가능한 것일까? spring initializr를 통해 프로젝트를 생성하면 main 클래스에 @SpringBootApplication 어노테이션을 볼 수 있다. @SpringBootApplication public class SpringbootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringbootDemoApplication.class, args); } } 이 어노테이션을 살펴보면 다양한 어노테이션들이 붙어있다. @Target(ElementType.TYPE) @Retention(RetentionPo..
스프링 AOP AOP란? Aspect Oriented Programming을 줄여서 aop 라고 하며 문제를 바라보는 관점을 기준으로 프로그래밍 하는 기법으로 핵심적인 관심사항과 공통적인 관심사항(cross-cutting concern)을 기준으로 모듈화 하는 프로그래밍 기법이다. AOP 용어 정리 Aspect: 여러 객체에 공통으로 적용하는 기능 Target: Aspect를 적용하는 대상 Advice: 언제 공통 핵심기능을 핵심 로직에 적용할지를 정의 ex)메서드 호출 전 Joinpoint: Advice를 적용가능한 지점. 메서드 호출, 생성자 호출시점, 필드 값 변경 등 Pointcut: Joinpoint의 부분집합으로 실제로 Advice가 적용되는 Joinpoint Weaving: 공통 코드를 핵심로직 코드에 삽..
빈의 스코프 빈의 스코프 스프링 빈의 범위에는 싱글톤(Singleton)과 프로토타입(Prototype)가 있다. 싱글톤 스코프는 스프링에서 별도의 설정을 하지 않은 경우 기본적으로 동작하는 방식으로 애플리케이션이 구동될 떄 하나의 인스턴스만 생성하고 여러번 호출 할때 매번 동일한 객체를 리턴한다. 반대로 프로토타입 스코프는 매번 새로운 인스턴스를 생성하여 매번 다른 객체를 리턴한다. 아래에 간단한 예시로 확인해보자. @Component public class Singleton { } @Component @Scope("prototype") public class Prototype { } 이렇게 두 개의 클래스를 빈으로 등록을하는데 Protytype 클래스의 범위는 prototype으로 하였다. 이후 Applicati..
애노테이션(Annotation을 이용한 의존객체 주입 의존객체 자동 주입 스프링에서는 개발자가 일일히 의존정보를 설정하지않아도 스프링 컨테이너가 자동으로 스프링 빈 객체간의 의존을 설정해주는 기능을 제공한다. 의존객체를 자동을 주입하기 위해서 사용하는 방법이 몇가지 있는데, @Autowired, @Resource, @Inject 애노테이션을 이용하여 설정할 수 있다. 애노테이션 기반의 의존객체 자동주입을 사용하기위해선 xml 파일에 태그를 추가해야 한다. http://www.springframework.org/schema/context/spring-context.xsd"> @Autowired @Autowired 애노테이션은 의존 관계를 자동으로 설정할 때 사용되며 생성자, 필드, 메서드에 적용 가능하다. 1. 프로퍼티 필수 여부 지정(required) 스프..
제어 역전(IoC)와 의존성주입(DI) 제어의 역전(Inversion of Control) IoC는 간단히 말해 프로그램의 제어 흐름을 개발자가 아닌 프레임워크가 주도하는 것이다. 객체의 생성, 생명주기의 관리를 컨테이너가 맡아서 하게되어 제어권이 컨테이너로 넘어갔다고 하여 IoC(Inversion of Control)이라고 한다. 제어권이 컨테이너로 넘어감으로써 DI(의존성주입), AOP(관점지향 프로그래밍)등이 가능하게 되었다. 의존성 주입(Dependency Injection) 스프링은 기본적으로 DI기반으로 동작하기 때문에 DI에 대한 이해가 필수적이다. DI는 객체 사이의 의존성을 자신이 아닌 외부로부터 전달받는 구현방식으로 생성자 또는 세터(Setter)를 통해 전달받는 것을 말한다. 객체를 주입받지 않고 직접 생성하는 방법의 단점..