728x90
반응형

Spring 58

@Data

▶ @Data @Data 어노테이션은 @Getter / @Setter, @ToString, @EqualAndHashCode와 @RequiredArgsConstructor를 모두 다 합쳐놓은 큰 범주의 세트라고 할 수 있다. POJO(Plain Olde Java Objects)와 bean과 관련된 모든 보일러플레이트(boilerplate = 재사용 가능한 코드)를 생성한다. class의 모든 필드에 대한 getter, setter, toString, equals와 같은 함수들 말이다. // Lombok annotation 사용 @Data public class Member { private String name; private double score; } // Lombok annotation 미사용 pub..

Spring/Lombok 2022.05.03

@RestController @Requestbody @Responsebody

웹 서비스와 REST 방식이 시스템을 구성하는 주요 요소로 자리 잡으면서 웹 시스템 간 XML이나 JSON 등의 반정형 형식으로 데이터를 주고 받는 경우가 증가하고 있다. 이에 따라 스프링 MVC도 클라이언트에서 전송한 XML 데이터나 JSON 또는 기타 데이터를 컨트롤러에서 DOM 객체나 자바 객체로 변환해서 받을 수 있는 기능을 제공하고 있으며, 비슷하게 자바 객체를 XML이나 JSON 또는 기타 형식으로 변환해서 전송할 수 있는 기능을 제공하고 있다. ▶ @RestController @Controller와는 다르게 @RestController는 리턴값에 자동으로 @ResponseBody가 붙게 되어 별도 어노테이션을 명시해주지 않아도 HTTP 응답데이터(Body)에 자바 객체가 매핑되어 전달된다. ..

Spring/Lombok 2022.05.03

@Transactional

@Transactional 스프링에서 지원하는 @Transactional 어노테이션을 이용해 선언적 트랜잭션 처리가 가능하다. 그렇다면, Transactional이 뭘까? 우선, 트랜잭션이란(Transaction)이란? 자바 로직이 수행되는 동안 모든 과정이 오류없이 진행되면 매우 좋겠지만, 그렇게 간단하게 모든 것이 잘 되는 경우는 매우 드물다. 이럴 때 트랜잭션을 이용하여 오류가 없는 경우에만 데이터 베이스에 변경사항을 저장하고, 진행 도중 오류가 발생하게 되면 지금까지 진행했던 모든 과정들을 원래 상태로 되돌려놓는다. 즉, 데이터베이스의 상태를 변경하는 작업 또는 한 번에 수행되어야하는 연산들이 오류 없이 잘 동작하였을 경우에만 데이터베이스에 반영하고 그렇지 않은 경우에는 처음 상태의 데이터베이스로..

Spring/Lombok 2022.04.29

BaseTimeEntity - @MappedSuperclass @EntityListeners(AuditingEntityListener.class)

향로님의 "스프링부트로 웹 서비스 출시하기"에서 가져온 내용입니다! 자세한 내용 참고하고 싶으시면 https://jojoldu.tistory.com/251?category=635883 2) 스프링부트로 웹 서비스 출시하기 - 2. SpringBoot & JPA로 간단 API 만들기 이번 시간엔 SpringBoot & JPA로 간단한 API를 만들 예정입니다. Tip) 아직 SI 환경에선 Spring & MyBatis 를 많이 사용하지만, 쿠팡/우아한형제들/NHN Entertainment 등 자사 서비스를 개발하는 곳에선 SpringBoo.. jojoldu.tistory.com 참고 부탁드립니다. 생성시간 / 수정시간 자동화 - JPA Auditing 보통 Entity에는 해당 데이터의 생성시간과 수정시간..

Spring/Lombok 2022.04.29

롬복(Lombok), @AllArgsConstructor @NoArgsConstructor @RequiredArgsConstructor

▶ 롬복(Lombok) 롬복(Lombok)은 Java 라이브러리로 반복되는 getter, setter, toString 등의 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리이다. 반복되는 getter, setter, 생성자의 작성은 코드의 가독을 저해시키고, 번거로운 작업이 될 수 있다. 이는 전체 코드가 복잡해지는 현상을 유발한다. Lombok은 여러가지 어노테이션을 제공하고 이를 기반으로 코드를 컴파일과정에서 생성해주는 방식으로 동작하는 라이브러리이다. 즉 코딩과정에서는 롬복과 관련된 어노테이션만 보이고 getter와 setter 메서드 등은 보이지 않지만 실제로 컴파일된 결과물에는 코드가 생성되어있다. 간단한 예시 코드로 롬복의 편리함을 확인할 수 있다. 순수 Java 코드 public cla..

Spring/Lombok 2022.04.28

조회 빈이 2개 이상 존재할 때 해결법

@Autowired는 타입(Type)으로 조회한다. @Autowired private DiscountPolicy discountpolicy; 타입으로 조회하기 때문에, 마치 다음 코드와 유사하게 동작한다. ac.getBean(DiscountPolicy.class) 스프링 빈 조회에서 배웠듯이 타입으로 조회하면 선택된 빈이 2개 이상일 때 문제가 발생한다. (조회했을 때 존재하지 않는 타입이면 그 때도 문제 발생, 이를 피하기 위해서 "required = false"를 넣어주어야 한다.) DiscountPolicy의 하위 타입인 FixDiscountPolicy, RateDiscountPolicy 둘다 스프링 빈으로 선언해보자. @Component public class FixDiscountPolicy im..

생성자 주입을 선택하라

과거에는 수정자 주입과 필드 주입을 많이 사용했지만, 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다. 그 이유는 다음과 같다. 불변 대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다. 오히려 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안된다. (불변해야한다) 수정자 주입을 사용하면, set__ 메서드를 public으로 열어두어야한다. public으로 열어둘 경우 누군가 변경할 수도 있고, 변경하면 안되는 메서드를 열어두는 것 자체가 좋은 설계 방법이 아니다. 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일이 없다. 따라서 불변하게 설계할 수 있다. 누락 프레임워크 없이 순수한 자바 코드를 단위 테스트..

다양한 의존관계 주입 방법

의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 지금까지 우리가 진행했던 방법이 생성자 주입이다. 특징 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에 사용한다. package com.example.demo.service; import com.example.demo.discount.DiscountPolicy; import com.example.demo.discount.FIxDiscountPolicy; import com.example.demo.member.Member; import com.example.demo.order.Order; ..

컴포넌트 스캔

지금까지는 스프링 컨테이너를 생성할 때 설정할 때 설정 클래스에 @Configuration을 선언하고 그 안에 매서드를 통해 우리가 필요한 클래스들을 @Bean으로 스프링에 등록하였다. 하지만 이렇게 @Bean으로 설정하게 되는 경우 등록해야할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 힘들고, 누락하는 문제가 발생할 수도 있다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. package com.example.demo; import org.springframework.context.annotation.ComponentScan; import org.springfram..

싱글톤 방식의 주의점

싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 무상태(stateless)로 설계해야한다. 특정 클라이언트에 의존적인 필드가 있으면 안된다. 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다. 가급적 읽기만 가능해야 한다. 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다. 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다. package com.example.demo.singleto..

728x90
반응형