Spring Boot ๐ŸŒผ ์–ด๋…ธํ…Œ์ด์…˜

Doridamยท2023๋…„ 6์›” 2์ผ
0

Spring๐ŸŒฑ & Boot ๐ŸŒผ

๋ชฉ๋ก ๋ณด๊ธฐ
7/12


Annotation

Annotation์€ ์‚ฌ์ „์  ์˜๋ฏธ๋กœ๋Š” ์ฃผ์„์ด๋ผ๋Š” ๋œป์ด๋‹ค.
์ž๋ฐ”์—์„œ Annotation์€ ์ฝ”๋“œ ์‚ฌ์ด์— ์ฃผ์„์ฒ˜๋Ÿผ ์“ฐ์ด๋ฉฐ ํŠน๋ณ„ํ•œ ์˜๋ฏธ, ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
์˜ˆ์•ฝ์–ด ์•ž์— @๋ฅผ ๋ถ™์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

SpringBoot Annotation

Spring์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์–ด๋…ธํ…Œ์ด์…˜์€ ํ•„๋“œ, ๋ฉ”์„œ๋“œ, ํด๋ž˜์Šค์— ์ ์šฉ๋˜๋ฉฐ Bean ๋“ฑ๋ก, ์˜์กด์„ฑ์ฃผ์ž…, urlMapping, MVC ํŒจํ„ด ์ ์šฉ๋“ฑ์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

์ฃผ์š” Annotation

@SpringBootApplication : SpringBoot ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋Š” main ํด๋ž˜์Šค์— ์ ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜@ComponentScan, @EnableAutoConfiguration, @SpringBootConfiguration ๋“ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ธํ•ด main Class ์ดํ•˜ ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” ํด๋ž˜์Šค๋“ค์„ ์ž๋™์œผ๋กœ Bean ์œผ๋กœ ๋“ฑ๋ก ์‹œ์ผœ์ค€๋‹ค.

@SpringBootApplication
public class ApiTestApplication {
	public static void main(String[] args) {
		SpringApplication.run(ApiTestApplication.class, args);
	}
}

@Configuration : @Configuration ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์Šค์บ”ํ•˜์—ฌ ๋นˆ ๊ตฌ์„ฑ์„ ๋กœ๋“œํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋กํ•œ๋‹ค.

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

@Autowired : DI(Dependency Injection) ๋Œ€์ƒ์œผ๋กœ ์ง€์ •, ํ•„๋“œ, ์ƒ์„ฑ์ž, setter ๋ฉ”์„œ๋“œ์— ์ ์šฉํ•˜์—ฌ DI๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Service
public class RestApiServiceLogic implements RestApiService {
    private final RestApiRepository apiRepository;
      @Autowired
      public RestApiServiceLogic(RestApiRepository apiRepository) {
          this.apiRepository = apiRepository;
      }

@Bean : @Configuration ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฉ”์†Œ๋“œ ๋‹จ์œ„๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ง์ ‘ ์ œ์–ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ฑ์„ Bean์œผ๋กœ ๋งŒ๋“ค๋ คํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์‚ฌ์šฉ์‹œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” getter์™€ ๋น„์Šทํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฆฌํ„ด์— new๋ฅผ ๋ถ™์—ฌ ์ƒ์„ฑ๊ณผ ๋ฆฌํ„ดํ•œ๋‹ค. Bean id๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ camelCase๋กœ ๋ณ€๊ฒฝํ•œ๊ฒƒ์ด bean id๋กœ ์ง€์ •๋œ๋‹ค.

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

@Component : ํด๋ž˜์Šค๋ฅผ @ComponentScan์˜ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•œ๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์Šค์บ”๋˜๋ฉด ์ž๋™์œผ๋กœ Bean ๋“ฑ๋ก์ด ๋œ๋‹ค.

@Component
public class comTest {
}

@ComponentScan : ์Šค์บ”์— ๋Œ€ํ•œ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๊ณ  ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ์Šค์บ”ํ•˜์—ฌ @Component ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ Class๋“ค์„ Bean ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ์ œ์™ธ ์‹œํ‚จ๋‹ค.

@Configuration
@ComponentScan("com.api.")
public class comScaner {
}

@RequestMapping : ์š”์ฒญ URL๊ณผ ๋ฉ”ํ•‘๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

    @RequestMapping("/logout")
    public void logout(){
    }

๋งŒ์•ฝ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— ์ ์šฉ์‹œํ‚ฌ ๊ฒฝ์šฐ ๊ณตํ†ต URL ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

@RestController
@RequestMapping("/member")
public class RestApiController {
    @RequestMapping("/logout") // "/member/logout"
    public void logout(){
    }

@GetMapping : RequestMapping๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ Post, Put, Patch๋“ฑ ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    @GetMapping("/request")
    public String postmanTest(){
        return "";
    }

@Controller : URL mapping ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ ๋ชจ๋ธ ๋ฐ ๋ทฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ModelAndView ๋“ฑ View์™€ Model์„ ์ž‡๋Š” MVCํŒจํ„ด์ค‘ Controller ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋œ๋‹ค.

@Controller
public class RestApiController {
	...
}

@ResponseBody : ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ JSON, XML๋กœ ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. HTTP ์‘๋‹ต body์— ์ง์ ‘ ์“ฐ๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋จ.

@GetMapping("/request")
    @ResponseBody
    public String postmanTest(){
        return "asd";
    }

@RestController : @ResponseBody์™€ @Controller๊ฐ€ ๊ฒฐํ•ฉ๋œ ํ˜•ํƒœ, RESTful ์›น ์„œ๋น„์Šค ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•จ. ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ HTTP body์— ์“ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ View๋กœ ์‘๋‹ตํ•˜์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— API ๊ตฌํ˜„์‹œ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— @ResponseBody๋ฅผ ์ ์šฉํ•œ๋‹ค.

@RestController
public class RestApiController {
	...
}

@Service : streotype ์ค‘ ํ•˜๋‚˜, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” Service ํด๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ„. Bean ๋“ฑ๋ก, DI, @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•œ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

@Service
public class RestApiServiceLogic {
	...
}

@Repository : streotype ์ค‘ ํ•˜๋‚˜, ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. DataAccessException ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ฐ ๋กœ๊น…์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Repository
public class RestApiRepositoryLogic{
	...
}

@Slf4j : Logger ๊ฐ์ฒด ์ƒ์„ฑ ์—†์ด ๋ฐ”๋กœ log.debug()๋กœ ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

@Slf4j
public class apiTest{
	public void testMethod(String msg){
    	log.debug("msg : " + msg);
    }
}

AOP์—์„œ ์‚ฌ์šฉํ•˜๋Š” Annotation

AOP์—์„œ ์‚ฌ์šฉ๋˜๋Š” Annotation
@Aspect : AOP ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

	@Aspect
   	class A{
    }

@Before : ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ด์ „์— ์ž‘๋™๋  ํ•จ์ˆ˜๋กœ ์ง€์ •ํ•œ๋‹ค.

	@Before("b()")
    public void test2(){
   	}

@After : ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ ์ดํ›„์— ์ž‘๋™๋  ํ•จ์ˆ˜๋กœ ์ง€์ •ํ•œ๋‹ค.

	@After Returning("b()")
  	public void test3(){
  	}

@Around : ํƒ€๊ฒŸ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ํ›„๋กœ ์ ์šฉ๋  ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

    	@Around("b()")
		public void test(){
        }

@Pointcut : AOP๋ฅผ ์ ์šฉ์‹œํ‚ฌ ์ง€์ ์„ ์„ค์ •ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

    @Pointcut("execution(* com.test)")
    public void serviceMethods() {
    }

@AfterReturning : ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์„ฑ๊ณต์‹œ ์ ์šฉ๋  ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

   	@After Returning("b()")
 	public void test3(){
 	}

@AfterThrowing : ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์‹œ ์˜ˆ์™ธ๋ฐœ์ƒ์‹œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 	@After Throwing("b()")
   	public void test4(){
 	}

Lombok์—์„œ ์‚ฌ์šฉํ•˜๋Š” Annotation

Lombok์€ ๋ฐ˜๋ณต๋˜๋Š” Getter, Setter, ์ƒ์„ฑ์ž, toString, builder ๋“ฑ ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

์ฃผ๋กœ Model ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด Getter, Setter์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™์ƒ์„ฑ๋œ๋‹ค.

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int userNo;
    private String userId;
    private String userPw;
}

@Getter : ํ•„๋“œ ๋ณ€์ˆ˜๋“ค์˜ Getter๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
@Setter : ํ•„๋“œ ๋ณ€์ˆ˜๋“ค์˜ Setter๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
@AllArgsConstructor : ๋ชจ๋“  ํ•„๋“œ ๋ณ€์ˆ˜๋“ค์ด ํฌํ•จ๋œ ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
@NoArgsConstructor : ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
@Builder : Builder ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜. ๋ฉ”์„œ๋“œ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•œ ๊ฐ€๋…์„ฑ ์žˆ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ๊ฐ€๋Šฅ
-โ€ป @AllArgsConstructor์™€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์‹œ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ํ•„๋“œ์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด Getter, Setter๋“ฑ ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋‹ค๋ฉด ์ž๋™์œผ๋กœ ์ž‘์„ฑ๋œ๋‹ค.

profile
๋„๋ฆฌ๋„๋ฆฌ๋‹ด๋‹ด ๐Ÿค๐Ÿฅ๐Ÿค๐Ÿฅ๐Ÿฃ๐Ÿฃ

0๊ฐœ์˜ ๋Œ“๊ธ€