본문 바로가기
반응형

IT 개인 공부/Spring14

[Spring] Bean Validation 특정 필드에 대해 검증해야 할 경우가 발생할 수 있다. 예를 들어 회원가입 기능을 구현한다고 해보자. 이름(String)과 나이(Integer)는 값이 무조건 입력되어야 하는 필수요소라고 하자. 클라이언트의 실수로 값을 입력하지 않는 경우, 범위를 벗어나거나는 경우, 나이에 Integer가 아닌 String 타입의 값을 입력하는 경우 등 잘못된 상황이 발생할 수 있다. 이때 우리는 검증을 통해 클라이언트에게 잘못된 값을 입력하였다는 것을 알려줄 수 있어야 한다. 그래야 클라이언트는 올바른 값을 입력할 것이기 때문이다. 이는 BindingResult를 활용하면 해결할 수 있다. 하지만 FieldError나 ObjectError를 통해 매번 코드로 검증 기능을 작성하는 일은 상당히 번거로울 수 있다. 특히 .. 2021. 9. 23.
[Spring] @PostConstruct에서 @Transactional 처리 시 문제점 간단한 웹 프로젝트를 진행하고 있는데 테스트할 때마다 매번 DB에 데이터들을 추가해줘야 하는 번거로움이 존재하였다. 이를 해결하기 위해 TestData이라는 클래스를 스프링 빈으로 등록한 후 init() 메서드에 @PostConstruct를 적용하여 TestData 빈이 스프링 컨테이너에 등록될 때 자동으로 테스트 데이터를 DB에 추가하도록 하였다. Member, MemberService, MemberRepository 클래스는 다음과 같이 구현되어 있다. MemberService에는 @Transactional을 걸어주었고, MemberRepository에는 @Transactional을 걸어주지 않았다. @Getter @Setter @Entity public class Member { @Id @Gener.. 2021. 9. 17.
[Spring] 양방향 매핑시 주의점 : toString 이름과 나이를 멤버 변수로 가지는 Member라는 클래스가 있다고 하자. public class Member { private String name; private int age; //Getter & Setter } Member의 정보를 눈으로 확인하고 싶은 경우 다음과 같은 방식을 사용할 것이다. System.out.println("Member [name=" + member.getName() + "] [age=" + member.getAge() + "]"); 하지만 이 방법은 매번 코드를 작성해야 하는 번거로움이 존재한다. 이는 toString() 메서드를 재정의하여 재사용하는 방식으로 해결해줄 수 있다. @Override public String toString() { return "Member{" .. 2021. 9. 15.
[Spring] AOP가 적용되지 않은 메서드에서 AOP가 적용된 메서드를 호출하면 AOP가 정상적으로 동작할까? Spring AOP를 공부하던 도중 "AOP가 적용되지 않은 메서드에서 AOP가 적용된 메서드를 호출하면 AOP가 정상적으로 동작할까?"라는 의문을 가지게 되었다. 이를 알아보기 위해 코드를 작성하고 여러 가지 테스트를 실행해보자. 먼저 어노테이션 기반의 단순한 @TestExecution을 선언하자. @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestExecution { } @Aspect @Component public class TestAspect { @Around("@annotation(TestExecution)") public Object logExecutionTime(ProceedingJoinP.. 2021. 9. 11.
[Spring] AOP란? 스프링 프레임워크에는 스프링 트라이앵글이라는 것이 존재한다. 이는 스프링 프레임워크의 핵심 요소를 나타내는 것인데 이 중 하나인 AOP에 대해서 알아보도록 하자. AOP는 Aspect-Oriented Programming의 약자로써 그대로 번역하면 관점-지향 프로그래밍을 의미한다. 그렇다면 관점이라는 것이 무엇을 의미하는 것일까? 이는 말보다 그림으로 이해하는 것이 편하다. A, B, C의 클래스가 존재한다고 해보자. 각 클래스는 특정 로직을 수행하는 메서드를 하나씩 가진다. 그런데 성능 측정을 위해서 메서드가 수행되는 시간을 측정해야 하는 요구사항이 들어왔다고 생각해보자. 가장 단순한 방법은 A, B, C 클래스에 시간 측정 로직을 모두 넣는 방법일 것이다. 근데 이 방법은 상당히 비효율적이다. 매번 .. 2021. 9. 9.
[Spring] 서블릿 필터 vs 스프링 인터셉터 권한이 있는 사용자만 특정 URI에 접속할 수 있어야 하는 경우가 발생할 수 있다. 예를 들어 로그인된 사용자만 게시판에 글을 작성할 수 있다면, 로그인되지 않은 사용자는 게시판 작성 URI에 접속해서는 안된다. 즉, URI마다 특정 조건을 걸어서 권한이 없는 사용자를 필터링할 수 있어야 하는데 이는 서블릿 필터 or 스프링 인터셉터를 활용하면 해결할 수 있다. 공통 관심사로 분류할 수 있기 때문에 AOP를 활용해도 되지만 웹과 관련된 공통 관심사는 HTTP 헤더나 URI 정보들이 필요하기 때문에 HttpServletRequest를 제공하는 이들을 사용하는 것이 좋다. 서블릿 필터 서블릿 필터는 서블릿에서 지원하는 기능으로 서블릿 이전에 필터가 적용된다. 따라서 필터에서 적절하지 않은 요청이라 판단되면 .. 2021. 9. 5.
[Spring] HTTP 메시지 컨버터 클라이언트에서 서버로 요청 데이터를 전달할 때는 주로 다음과 같은 방법을 통해 전달한다. GET + 쿼리 파라미터 POST - HTML Form HTTP Message Body 반대로 서버에서 클라이언트에 응답 데이터를 전달할 때는 다음과 같다. 정적/동적 HTML HTTP Message Body HTTP API를 제공하는 경우에는 HTTP Message Body에 JSON, XML, TEXT 형식으로 데이터를 직접 담아서 요청 및 응답을 처리한다. Spring에서는 HttpEntity 객체나 @RequestBody, @ResponseBody 어노테이션을 사용하면 데이터를 직접 매핑할 필요 없이 자동으로 요청 및 응답 데이터를 적절한 데이터 형식으로 변환해준다. @Slf4j @Controller @Req.. 2021. 9. 3.
[Spring] 빈 스코프(Scope) 종류 스프링 컨테이너에서 다양한 빈들을 관리해줌으로써 애플리케이션을 개발할 때 굉장히 편리하게 개발할 수 있는 장점이 있다. 스프링 빈의 생명주기는 다음과 같다. 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료 빈 스코프란 빈이 스프링 컨테이너에서 존재할 수 있는 범위를 의미한다. 스프링은 다양한 스코프를 지원하는데 싱글톤, 프로토타입, 웹 관련 스코프들에 대해서 알아보도록 하자. 싱글톤 스코프 스프링 컨테이너에 빈을 등록하면 기본적으로 싱글톤 패턴으로 빈을 관리해준다. 애플리케이션 생명주기 동안 해당 빈의 요청이 발생할 때마다 항상 동일한 빈을 제공해줘야 하기 때문에 싱글톤 스코프는 스프링 컨테이너의 시작과 종료, 모든 생명주기.. 2021. 8. 23.
[Spring] 싱글톤 컨테이너 : CGLIB 스프링 컨테이너에 빈(Bean)을 등록하면 기본적으로 싱글톤 패턴으로 빈을 관리하게 된다. 따라서 해당 빈을 요청하게 되면 항상 동일한 빈을 반환해주는 것을 확인할 수 있다. 물론 기본 빈 등록 방식이 싱글톤 방식이라는 의미이며, 요청할 때마다 새로운 객체를 생성하여 반환해주는 프로토타입 방식 등 빈 스코프에 따라 다른 방식도 제공한다. 싱글톤 패턴이란 클래스의 인스턴스가 1개만 생성됨을 보장해주는 디자인 패턴으로 해당 인스턴스를 공유하여 사용함으로써 메모리를 절약할 수 있는 장점이 있다. 싱글톤 패턴에 대해서 공부하고 싶다면 다음 글들을 참고하길 바란다. https://sorjfkrh5078.tistory.com/107?category=1007502 싱글톤 패턴(Singleton Pattern) 싱글톤.. 2021. 8. 22.
반응형