티스토리 뷰

반응형

Spring 자주 사용하는 어노테이션 설명

 

@Configuration

— config용으로 사용할 때

— @Bean을 수동적으로 빈에 등록

— @Bean을 Bean에 등록할 때 싱글톤이 되도록 함

 

@Bean

— @Configuration이나 @Component 어노테이션이 붙은 클래스 내에 메서드 레벨에서 사용 가능

— @Configuration이나 @Component 없이 사용하면 빈에 등록 되지만 싱글톤 유지가 안됨

— 특정 객체를 의존하는 다른 객체들에게 의존성을 주입하기 위해서 사용

— 개발자가 직접 작성하지 않은 서드파티 라이브러리의 설정과 같은 의존성을 주입받기 위해 사용

— 중복된 이름이 없도록 주의

 

@Component

— 자바 빈으로 등록 시켜 줌

— Spring 프레임워크에서 인스턴스 생성과 소멸을 관리 (DI)

— @ComponentScan 있어야 자동 등록이 가능

// @Component 없이 사용시 에러
public class xxxUtil {
	...
}

@RequiredArgsConstructor
public class xxxService{
	private final ApiUtil apiUtil;
	...
}
Error
Parameter 0 of constructor in ...service.xxxService required a bean of type '...commons.util.xxxUtil' that could not be found.

// ************************************************************************************************************

// @Component 사용시 정상작동
@Component
public class xxxUtil {
	...
}

@RequiredArgsConstructor
public class xxxService{
	private final ApiUtil apiUtil;
	...
}

 

@Autowired

— Spring에서 필요한 종속성의 인스턴스를 자동으로 주입

— Spring 관리 빈으로 표시하기 위한 범용 어노테이션

— Spring은 @Component의 메타 어노테이션인 @Service, @Controller 및 @Repository 라는 보다 구체적인 어노테이션들을 제공

 

@RequiredArgsConstructor

— 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 주며, 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용

// @RequiredArgsConstructor 사용 이전
public class XXX {
	@Autowired
	private XXXService xxxService;
}

// @RequiredArgsConstructor 사용 이후
@RequiredArgsConstructor
public class XXX {
	private final XXXService xxxService;
}

 

@AllArgsConstructor

— 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성

— 모든 필드 값을 파라미터로 받는 생성자를 생성

 

@NoArgsConstructor

— 파라미터가 없는 생성자를 생성

 

@Deprecated

— 더 이상 사용하지 않기를 바라는 API, 안정성을 보장하지 않거나 조만간 삭제할 API 등에 사용

 

@Override

— 메서드 선언에만 달 수 있으며, 이 어노테이션의 의미는 상위 타입(부모 타입)의 메서드를 재정의했음을 의미

— 컴파일러에게 부모 클래스에 있는 메서드명과 매개 변수 등이 동일한지 체크

 

@Data

— @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor, @Value 를 합쳐 놓음

 

@Getter

— private 필드 변수를 외부에서 접근 가능하도록 함

 

@Setter

— private 필드 변수를 외부에서 접근 가능하도록 함

 

@ToString

— 갖고 있는 값을 문자열로 만들어 리턴 하도록 함

 

@Value

— properties 파일로 관리되는 설정 정보를 사용할 수 있도록 정의

application.properties
xxx.key = test

@Value("${xxx.key}")
private String key;

 

@EqualsAndHashCode

— equals() 메소드와 hashCode() 메소드가 자동으로 생성

— equals : 내용이 같은지 비교, hasCode : 두 객체가 같은 객체인지 비교

 

@Builder

— 빌터 패턴 별 특징

— 1. 점층적 생성자 패턴 각 생성자를 오버로딩 해서 만드는 기초적인 방식

public class User {

    private String id;        //필수
    private String password;  //필수
    private Auth auth;        //선택

    public User(String id) {
        this.id= id;
    }

    public User(String id, String password) {
        this.id = id;
        this.password = password;
    }

    public Member(String id, String password, Auth auth) {
				this.id = id;
        this.password = password;
        this.auth = auth;
    }
}

User user = new User("test", "123", A);

— 2. 자바 빈즈 패턴 getter/setter를 이용하여 객체를 생성할때 필드를 주입

public class User {

    private String id;        //필수
    private String password;  //필수
    private Auth auth;        //선택

		public String getId() {
				return getId;
		}
		public void setId(String getId) {
				this.getId = getId;
		}
		...
}

User user = new User();
user.setId("test");
user.setPassword("123");
user.setAuth(A);

— 3. 빌더 패턴 자바 빈즈 패턴처럼 받되, 데이터 일관성을 위해 정보들을 다 받은 후에 객체를 생성

public class User {

    private String id;        //필수
    private String password;  //필수
    private Auth auth;        //선택

    public static class Builder {
        private final String id;
        private final String password;
        private Auth auth;

        // 필수변수는 생성자로 값을 넣음
        public Builder(String id, String password) {
		        this.id = id;
		        this.password = password;
        }

        // 변수별 메소드는 빌더클래스의 필드값을 set하고 빌더객체를 리턴
        public Builder auth(Auth auth) {
            this.auth= auth;
            return this;
        }

        // 빌더메소드
        public User build() {
            return new User(this);
        }
    }

    public User(Builder builder) {
        this.id = builder.id;
        this.password = builder.password;
        this.auth = builder.auth;
    }
}

User user = new Builder("test", "123")
                .auth(Auth.A)
                .build();

— 빌더 클래스(패턴)을 용의하게 사용

@Builder
public class User {
    private String id;        //필수
    private String password;  //필수
    private Auth auth;        //선택
}

User user = User.builder() // @Builder으로 생성된 빌더클래스 생성자
                .id("test")
                .password("123")
                .auth(Auth.A)
                .build();

참조 : https://sudo-minz.tistory.com/133

 

@Alias

— mybatis에서 지원하는 어노테이션이며 별칭 지정 사용

@Alias("userDto")
public class UserDTO {
  private String id; 
  private String name; 
}

<select id="findById" resultType="userDto">
   SELECT * FROM USER
   WHERE ID = #{id}
</select>

 

@Repository

— DAO(Data Access Object)나 Repository Bean을 나타내는 데 사용

— @Repository 어노테이션을 사용하면 해당 클래스가 DB와 상호 작용하는 클래스임을 유추 가능

— 스프링 빈으로 등록하면 해당 클래스에서 제공하는 DB 연동 기능을 스프링에서 관리

— root-context.xml에 SqlSessionFactory와 SqlSessionTemplate 빈 객체 주입 및 데이터소스 설정

@Repository
public class TestDaoImpl {
    @Autowired
    SqlSession sqlSession;

    public void insertData(String data) {
    	sqlSession.insert("test.insertData", data);
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
	<insert id="insertData" parameterType="java.lang.String">
		INSERT INTO TB_TABLE SET data = #{data}
	</insert>
</mapper>

 

@Mapper

— MyBatis 3.0부터 지원하며 @Mapper 선언 후 interface를 생성하면 따로 implements(구현) 생략

— 생성한 메서드명과 sql Id가 일치하도록 함

— namespace는 인터페이스의 풀패키지 경로를 입력

@Mapper
public interface TestMapper {
    public int insertData(String data);
}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.xxx.xxx.api.TestMapper">
    <insert id="insertData" parameterType="java.lang.String">
			INSERT INTO TB_TABLE SET data = #{data}
		</insert>
</mapper>

 

@Transactional

— DB에 수행되는 쿼리들을 하나의 트랜젝션으로 묶어주며, 속성 혹은 예외처리 종류에 따라 rollback기능을 동작

— 메서드 단위로 설정

 

@JsonInclude

— Jackson의 ObjectMapper 사용 없이 Json 데이터를 Java Object로 변환

 

@Valid

— 클라이언트에서 넘어온 데이터를 객체(DTO or VO)에 바인딩 시 아래 어노테이션 유효성 검사

Anotation 제약조건

@NotNull Null 불가
@Null Null만 입력 가능
@NotEmpty Null, 빈 문자열 불가
@NotBlank Null, 빈 문자열, 스페이스만 있는 문자열 불가
@Size(min= , max= ) 문자열, 배열등의 크기 충족 여부
@Pattern(regex= ) 정규식 충족 여부
@Max(숫자) 지정 값 이하 충족 여부
@Min(숫자) 지정 값 이상 충족 여부
@Future 현재 보다 미래 충족 여부
@Past 현재 보다 과거 충족 여부
@Positive 양수만 가능
@PositiveOrZero 양수와 0만 가능
@Negative 음수만 가능
@NegativeOrZero 음수와 0만 가능
@Email 이메일 형식만 가능
@Digits(integer= , fraction = ) 대상 수가 지정된 정수와 소수 자리 수 보다 작은 지 여부
@DecimalMax(value= ) 지정된 값(실수) 이하  여부
@DecimalMin(value= ) 지정된 값(실수) 이상 여부
@AssertFalse false 여부
@AssertTrue true 여부
public class Test {   
 
    @NotEmpty
    private String id;    

    @NotEmpty
    private String password;    
    ...

}
@RestController
public class TestController {

    ...

    @PostMapping("/test")
    public ResponseEntity selectTest(@RequestBody @Valid Test test) {
        ...
    }

}

 

@Validated

— @Valid의 확장된 기능이며, 그룹핑 목적으로 사용

 

@Controlleradvice

— 전역 예외 처리 기능

— @ExceptionHandler, @InitBinder, @ModelAttribute, @Component 포함되어 있음

— @Component을 통해 빈으로 관리 가능

 

@RestControllerAdvice

— Controlleradvice 기능 + @ResponseBody 가 포함되어 있음

— Json 데이터 타입

 

@ExceptionHandler

— Bean에서 발생하는 예외를 잡아 하나의 메서드에서 처리해주는 어노테이션

— Controller와 RestController에서는 사용이 가능하며 @Service나 @Repository가 적용된 곳에는 사용이 불가능

 

@ConfigurationProperties(prefix = "")

— Spring Boot 에서 properties 파일에 정의된 프로퍼티 중 주어진 prefix 를 가지는 프로퍼티들을 POJO 에 매핑하여 Bean 으로 만들수 있게 해주는 어노테이션

— Spring boot 2.2 부터 @ConfigurationPropertiesScan 을 이용하여 자바 빈에 등로되어 @Component 어노테이션 선언이 제외 됨 즉 Immutable한 프로퍼티 지원 가능해짐

 

 

꾸ㅡㅈ4ㄷㄱ5ㅏㅓ23542

반응형