롬복은 스프링을 공부하며 필수 라이브러리는 아니지만, 편리함에 맛들이면 빠져나올 수 없는 마성의 라이브러리.

롬복도 여러 어노테이션을 제공해 주고 있어서 자주 쓰는 것을 대상으로 간략하게 정리

 
@Getter / @Setter
자동으로 get(), set() 메소드를 생성
클래스나 클래스 내의 필드에서 모두 사용 가능하다.
@AllArgsConstrictor
모든 필드값을 매개변수로 받는 생성자를 생성.
@NoArgsConstructor
필드값을 무시한 기본 생성자를 생성.
@RequiredArgsConstructor
final 또는 @NonNull로 선언된 필드만 파라미터로 하는 생성자 생성.
@ToString
toString() 메소드를 자동으로 생성
@Data
위에서 언급한 모든 어노테이션을 만들어준다.
사실상 이것만 알아도 끝일 듯.
@Log4j2
클래스의 로그클래스를 자동으로 생성.

 

### 다음은 기능은 있는데 잘 안쓰는 기능(잘 모르는 기능)들을 정리.

@Builder
클래스 객체에 Builder패턴을 적용.
클래스 또는 생성자에 @Builder를 붙여서 사용.


* 빌더패턴과 @builder 사용에 대해 정리된 블로그
https://johngrib.github.io/wiki/builder-pattern/
@EqualsAndHashCode
equals() 와 hashCode() 를 생성해준다.
@Delegate
객체의 메소드를 다른 객체로 위임하여 줌.

 

'SPRING FRAMEWORK > ANNOTATION' 카테고리의 다른 글

@RequestMapping  (0) 2022.08.29
@Controller  (0) 2022.08.29
@Component  (0) 2022.08.29
@Bean  (0) 2022.08.28
Annotation / Meta-Data  (0) 2022.08.28

 

지난번에 @Controller 에 대해 정리하였다.

이번엔 @Controller의 단짝과도 같은 @RequestMapping 에 대해 정리한다.

 

@RequestMapping 은 URL을 컨트롤러의 메소드와 매핑하는 용도로 사용한다.

즉, 사용자가 어떤 사이트로 이동하기 위해 URL을 입력하여 이동하기를 요청한다면

@Controller가 요청을 받아 URL과 맞는 @RequstMapping을 찾아 준다.

 

@RequestMapping은 @Controller에서 받은 요청을 받기 위해 다양한 속성을 클래스 또는 메소드 단위로

지정해 줄 수 있다.

 

*속성

value
String[]
요청으로 들어온 URL Path값으로 매핑
method
RequestMethod[]
HTTP Request 메소드 값을 매핑 조건으로 부여
GET, POST, HEAD, PUT, DELETE 등등 (ENUM으로 정의)
params
String
HTTP Request 파라미터를 매핑 조건으로 부여

 

 

* value

URL 패턴을 지정한다.

문자열 배열로 구성되어 여러개의 경로를 지정할 수도 있다.

@RequestMapping(value = "/path")   // 가장 일반적인 쓰임새
@RequestMapping(value = "/path/**/DetailPath")  // **을 붙여주는 등 URL 패턴을 지정 가능
@RequestMapping(value = "/path1", "/path2")  // String 배열로 여러 경로를 처리 가능
@RequestMapping(value = "/path/{ID}")  // {}를 통해 컨트롤러에서 ID를 파라미터로 전달받음.
 

 

* method

HTTP Request 메소드를 정의한 ENUM으로 URL을 처리할 방법을 Method를 통해 각 메소드에 매핑이 된다.

즉, 동일한 URL이라도 정해준 메소드에 따라 처리할 메소드를 지정할 수 있다.

@RequestMapping(value = "/path/pathdetail", method = RequestMethod.GET)
public void method1(){}
@RequestMapping(value = "/path/pathdetail", method = RequestMethod.POST)
public void method2(){}
 

만약 URL이 GET방으로 지정되었다면 method1() 에서 요청이 처리되며 POST라면 method2에서 처리된다.

 

* params

URL에 파라미터로 값을 받는 경우 값에 따라서 매핑될 메소드를 지정할 수 있다.

@RequestMapping(value = "/path", params = "flag = true")
@RequestMapping(value = "/path", params = "flag = false")
 

이렇게 하면 URL에 전해준 flag 값에 따라 어떤 메소드에서 처리할지 정해줄 수 있다.

 

* 클래스에 붙인 @requestMapping

@RequestMappin은 클래스에도 붙여줄 수 있다.

@Controller
@RequestMapping(value = "/path")    // /path/**/ 
public class testClass {
     @RequestMapping(value = "/detailPath1")    // /path/dtailPath1
     public void testMethod1() {
    
   }

     @RequestMapping(value = "/detailPath2")    // /path/detailPath2
     public void testMethod2() {
    
   }
}
 

만약 요청된 URL 경로가 /path/detailPath1 로 들어오게 된다면 /path 를 매핑해준 testClass 에 들어오고

그 뒤의 경로가 detailPath1 이므로 testMethod에서 처리할 수 있다.

즉, Class 선언에 @RequestMapping 으로 적어준 경로를 공통으로 사용하며 그 뒤의 경로는 메소드에서

처리하는 것으로 매핑할 수 있다.

 

 

@RequestMapping 은 이 외에도 상속, 제네릭 등등으로 다양하게 사용하는 방법이 있다. (참고 블로그)

핵심적인 내용은 [ @RequstMapping 은 URL 이 들어왔을때 그 경로에 따라 어떻게 처리될 것인가를 지정해주는 것이다.] 라는 것을 기억하자.

 

 

# 참고 블로그

 

- 기본적인 사용방법

https://woolbro.tistory.com/43

 

- 기본 + 상속, 제네릭 등 응용해서 사용하는 방법

https://joont92.github.io/spring/@RequestMapping/

[spring] @RequestMapping

@RequestMapping은 DefaultAnnotationHandlerMapping에서 컨트롤러를 선택할 때 대표적으로 사용하는 애노테이션이다. url당 하나의 컨트롤러에 매핑되던 다른 핸들러 매핑과 달리 메서드 단위까지 세분화하여 적용할 수 있으며, url 뿐 아니라 파라미터, 헤더 등 더욱 넓은 범위를 적용할 수 있다. 속성 DefaultAnno

joont92.github.io

 

 

'SPRING FRAMEWORK > ANNOTATION' 카테고리의 다른 글

Lombok 어노테이션 정리  (0) 2022.08.29
@Controller  (0) 2022.08.29
@Component  (0) 2022.08.29
@Bean  (0) 2022.08.28
Annotation / Meta-Data  (0) 2022.08.28

 

어노테이션에 대해 정리를 시작하며 첫 번째로 정리했던 @Component에서 잠깐 언급했던 어노테이션이다.

@Component가 단순히 사용자가 만든 클래스를 Bean으로 등록하는 어노테이션 이라면

@Controller는 @Component에서 개념을 더 추가한 Bean 등록 어노테이션이다.

 

스프링을 공부하며 절대 피할 수 없는 개념인 MVC 패턴에서 C 부분을 스프링에게 알려주는 기능을 가지고 있다.

즉, IoC 컨테이너에 @Controller로 지정된 클래스를 Bean으로 등록하면 스프링은 Bean을 스캔하며

'이 클래스는 Controller 역활을 수행하는 클래스구나' 라는 것을 알 수 있다.

 

@Controller는 스프링을 접하며 가장 처음으로 만나게 되는 어노테이션이 아닐까 싶다.

이클립스에서 MVC Project로 프로젝트를 만들면 자동으로 만들어지는 HomeController.java 에 들어있다.

 

@Controller를 타고 들어가면 다음과 같은 설명을 만날 수 있다.

 

파파고 번역기를 돌려보니 다음과 같이 말해준다.

 

* 이 어노테이션은 {@linkComponent @Component}의 전문화한 역할 갖는다.

* 클래스 경로 검색을 통해 구현 클래스를 자동 검색할 수 있다.

* 일반적으로 다음 기준에 따라 주석 처리된 처리기 방법과 함께 사용된다.

* {@link org.springframwork.web.bind.annotation.RequestMapping} 어노테이션을 요청한다.

 

이 설명에서 말하는 경로 검색 및 자동 검색은 servlet-context.xml 에서 다음의 부분을 말하는 것이 아닐까 싶다.

<context:component-scan base-package="org.test.controller" />
 

설명의 마지막 줄에 적힌 RequestMapping 은 @RequestMapping를 뜻하는 듯 하다.

 

MVC에서 Controller는 요청이 들어온다면 해당 요청에 맞는 작업을 View와 Model에게 전달하는 역활을 한다. 즉, Controller는 요청을 받을 수 있어야 하기에 @RequestMapping이 대부분의 경우에 따라오는 것 같다.

 

@Controller
@RequestMapping(value = "/test")
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/**
	 * Simply selects the home view to render by returning its name.
	 */
	@RequestMapping(value = "/currtime", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		logger.info("Welcome home! The client locale is {}.", locale);
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		String formattedDate = dateFormat.format(date);
		model.addAttribute("serverTime", formattedDate );
		return "home";
	}
	
}
 

클래스에서 /test 를 맵핑하고 메소드에서 다시 /currtime을 맵핑하여

localhost:8080/controller/test/currtime/ 경로로 들어가면 아래와 같이 나오게 된다.

 

 

 

*참고 블로그

https://hardlearner.tistory.com/315

이미지 썸네일 삭제
스프링부트 - Controller란 무엇인가

스프링부트 Controller Spring Boot - Controller controller란 무엇인가? 사용자의 요청이 진입하는 지점(entry point)이며 요청에 따라 어떤 처리를 할지 결정해주며 단, controller는 단지 결정만 해주고 실질..

hardlearner.tistory.com

이미지 썸네일 삭제
스프링 MVC 컨트롤러 작성하기

- Develop OS : Windows10 Ent, 64bit - WEB/WAS Server : Tomcat v9.0 - DBMS : MySQL 5.7.29 for Linux (Docker) - Language : JAVA 1.8 (JDK 1.8) - Framwork : Spring 3.1.1 Release - Build Tool : Maven 3.6..

codevang.tistory.com

 

 

'SPRING FRAMEWORK > ANNOTATION' 카테고리의 다른 글

Lombok 어노테이션 정리  (0) 2022.08.29
@RequestMapping  (0) 2022.08.29
@Component  (0) 2022.08.29
@Bean  (0) 2022.08.28
Annotation / Meta-Data  (0) 2022.08.28

 

* 제공 : spring framework

import org.springframework.stereotype.Component;
 

* 설명 :

- 스프링에게 해당 클래스가 스프링에서 관리해야 하는 대상(Bean)이라는 것을 알려준다.

- 즉, Bean 클래스를 지정하여 Bean을 IoC 컨테이너에 등록한다.

- 개발자가 직접 생성한 클래스를 Bean 으로 등록한다. (@Bean과 확연한 차이점)

- @Component을 확장하여 @Service, @Controller, @Repository 등이 생겨났다.

- @Component는 모양을 바꾸거나 다른 어노테이션을 추가로 붙여 사용할 수도 있다.

 
Bean ID 지정하기
@Component("ID로 지정할 이름")
@Component 만 사용한다면 자동적으로 클래스의 이름을 ID로 사용
(앞글자는 소문자로 바뀜. DogClassName -> dogClassName)
@Lazy
Bean이 사용될 때 객체를 생성한다.
(일반적으로는 ApplicationContext 객체가 생성될때 Bean 도 생성)
@Scope

 

[Spring] @Component 애노테이션 및 함께 사용하는 애노테이션 정리

[Spring] @Component 애노테이션 및 함께 사용하는 애노테이션 정리 스프링 빈 설정 XML 파일에 나 자바 @Configuration 클래스에서 @Bean을 붙여 빈을 등록하던 것처럼 빈 클래스에 @Component 애노테이션..

atoz-develop.tistory.com

 


# 간단한 예제

*PetC 클래스

@Component  // 스프링에게 PetC를 Bean으로 등록할 것이라고 알려줌.
@Data
public class PetC {
	@Setter (onMethod_ = @Autowired)
	private Cat cat;
}
 

*Cat 클래스

@Component  // 스프링에게 Cat을 Bean으로 등록할 것이라고 알려줌.
@Data
public class Cat {
}
 

*root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
	http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<!--  @Component로 지정된 것들을 찾는다. -->
	<context:component-scan base-package="org.test.sample"></context:component-scan>	
</beans>
 

 


### 참고 ###

@Component 가 나오기 전에는 XML에 직접 Bean의 정보를 설정해야 한다. => 매우 불편 + 귀찮

 

*PetD 클래스

@Data
public class PetD {
	@Setter
	private Dog dog;
}
 

*Dog 클래스

@Data
public class Dog {
}
 

* root-context.xml

	<!-- dog 빈을 생성한다. -->
	<bean id="dog" class="org.test.sample.Dog"></bean>
	
	<!-- PetD에 dog를 주입한다. -->
	<bean id="petD" class="org.test.sample.PetD">
		<property name="dog" ref="dog"></property>
	</bean>
 

매번 Bean을 이렇게 등록해야 한다면 너무 힘들 것 같다.

 

 

*PetTest 클래스 (JUnit 테스트)

package org.test.sample;

import static org.junit.Assert.assertNotNull;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class PetTest {
	
	@Setter(onMethod_ = {@Autowired})
	private PetC petC;
	
	@Setter(onMethod_ = {@Autowired})
	private PetD petD;
	
	@Test
	public void testExam() {
		assertNotNull(petC);
		
		log.info("----------------------------------------------");
		log.info(petC);
		log.info("----------------------------------------------");
	
	}
	
	@Test
	public void testExam2() {
		assertNotNull(petD);
		
		log.info("----------------------------------------------");
		log.info(petD);
		log.info("----------------------------------------------");
	
	}
	
}
 

* 실행결과

 

'SPRING FRAMEWORK > ANNOTATION' 카테고리의 다른 글

Lombok 어노테이션 정리  (0) 2022.08.29
@RequestMapping  (0) 2022.08.29
@Controller  (0) 2022.08.29
@Bean  (0) 2022.08.28
Annotation / Meta-Data  (0) 2022.08.28

 

@Bean은 이름에서도 직관적으로 알 수 있듯이 Bean을 등록하는 어노테이션이다.

쓰임새는 @Component와 매우 유사하지만 결정적인 차이점이 있다.

 

@Component의 경우에는 사용자가 만들 클래스를 Bean으로 등록하기 위해 사용한다.

@Bean은 이미 만들어진 라이브러리를 통해 생성한 객체들을 Bean으로 등록한다.

만들어진 라이브러리는 사용자가 직접 컨트롤 할 수 없는 객체들을 말한다.

그 예로는 BCryptPasswordEncoder, ArrayList<> 등을 말한다.

확실히 가져다 쓰긴하지만 내가 만든 것들은 아니다.

 

@Bean을 사용하기 위해서는 @Configuration 으로 지정된 클래스 내에서 사용이 가능하다.

물론 @Bean만 사용하여도 Bean 등록은 가능하지만 Bean이 싱글턴임을 보장할 수가 없다.

그러므로 @Bean을 사용한다면 @Configuration을 꼭 붙여서 사용하자.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanTest {
	
	@Bean
	public Map<String, String> beanTestMap(){
		return new HashMap<String, String>();
	}
	
}
 

beanTestMap() 에 @Bean을 붙여보니 Servlet-context.xml 의 Beans Graph에 나오는 것을 확인할 수 있다.

 

@Component(id = "XXXX") 처럼 @Bean 또한 id를 지정할 수 있다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanTest {
	
	@Bean(name="nameBeanTest")
	public Map<String, String> beanTestMap(){
		return new HashMap<String, String>();
	}
	
}
 

 

#참고 블로그

@Bean / @Configuration 개념과 사용법을 자세하게 설명해 준 블로그

https://zgundam.tistory.com/26

이미지 썸네일 삭제
@Configuration과 @Bean을 이용한 Spring Framework 환경 설정의 Java 코드화..

흔히들 Spring Framework(이하 Spring)를 사용하면서 가장 많이 사용하는 환경설정 방법이 아마 XML일것으로 생각한다. 그나마 2.5때는 Spring에서 사용되는 모든 Bean을 전부 XML에 등록하는 식으로 개발 가이드..

zgundam.tistory.com

 

 

'SPRING FRAMEWORK > ANNOTATION' 카테고리의 다른 글

Lombok 어노테이션 정리  (0) 2022.08.29
@RequestMapping  (0) 2022.08.29
@Controller  (0) 2022.08.29
@Component  (0) 2022.08.29
Annotation / Meta-Data  (0) 2022.08.28

 

어노테이션은 스프링이 아닌 자바에서 나오는 개념이기에 스프링에서는 간략하게만 정리.

 

0. 메타데이터

- 데이터의 속성정보.

- 어떤 데이터에 대한 정보를 말한다. 즉, 데이터를 설명하는 기본 데이터이다.

- 데이터가 'x카페' 라면 메타데이터는 x카페의 [카페주소], [대표자명]처럼 x카페를 설명하는 부가적인 요소이다.

- 어떤 동네의 카페들의 위치를 검색하게 되면 xx카페의 메타데이터인 [카페주소]를 통해 찾을 수 있듯이,

메타데이터를 이용하면 데이터를 분석, 분류, 검색 등이 쉽고 빠르게 가능하다.

 

1. 어노테이션 개념

- 일종의 메타데이터.

- 작성한 코드를 컴파일, 런타임 중에 해당 코드를 어떻게 처리할 것인가를 정리해 둔 안내문이다.

- 주석이 개발자를 위한 것이라면 어노테이션은 컴퓨터에게 알려주기 위한 주석이라 생각하자.

- 자바는 JDK 1.5 부터 지원 시작.

- 스프링에서는 2.5 버전부터 어노테이션을 통한 설정을 도입.

 

2. 어노테이션의 용도.

- 컴파일러에게 코드의 Syntex 체크 정보를 제공

- 프로그램(응용프로그램, 개발툴, 배치프로그램 등등)에게 코드 자동 생성 정보 제공

- 프로그램이 실행되는 중에 특정 기능을 실행하기 위한 정보 제공

 

* 잘 설명된 블로그

어노테이션 - https://simostory.tistory.com/32

JAVA @어노테이션이란?

설명하기 앞서 어노테이션을 보다 쉽게 이해를 돕기위해서 메타데이터란 무엇인지 알아보자 메타데이터란? 메타데이터란 데이터의 대한 속성정보이다, 데이터의 대한 데이터로서 하위 레벨 데이터를 설명 및 기술..

simostory.tistory.com

메타데이터 - https://joyfuls.tistory.com/24

'메타데이터(metadata)'란?

"데이터를 위한 데이터" '속성정보'라고도 불리는 메타데이터는 '데이터에 관한 구조화된 데이터', '다른 데이터를 설명해 주는 데이터'이다. 대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용..

joyfuls.tistory.com

 

 

'SPRING FRAMEWORK > ANNOTATION' 카테고리의 다른 글

Lombok 어노테이션 정리  (0) 2022.08.29
@RequestMapping  (0) 2022.08.29
@Controller  (0) 2022.08.29
@Component  (0) 2022.08.29
@Bean  (0) 2022.08.28

+ Recent posts