π[Spring] μ€νλ§ μ λ Έν μ΄μ μ λν΄μβ¦
μ€νλ§ μ λ Έν μ΄μ μ λν΄μβ¦
μ€νλ§μλ μ λ
Έν
μ΄μ
μ΄λΌλκ² μλ€.
μ΄κ² λκΉ?
Annotation: μ£Όμ
μ λ»μ κ°μ§κ³ μμ§λ§, μ΄λ€ μν μ νλμ§ λͺ
μνλ κΈ°λ₯ μ΄μΈμ λ€μν κΈ°λ₯λ€μ΄ μλ€.
μμΌλ‘ 곡λΆλ₯Ό νλ€κ° μ²μ보거λ λͺ¨λ₯΄λ μ λ
Έν
μ΄μ
μ μ¬κΈ°μ μμλ‘ μ
λ‘λνμ¬ κΈ°λ‘ν κ±°μ!
μμ£Ό μ¬μ©νλ μ λ Έν μ΄μ
@Component
κ°μ²΄λ₯Ό μ€νλ§ μ»¨ν
μ΄λμ μ€νλ§ λΉμΌλ‘ λ±λ‘ν λ μ¬μ©νλ€.
μ€νλ§μ λμ μμ @Component
μ λ
Έν
μ΄μ
μ λ³΄κ³ μλμΌλ‘ μ€νλ§ λΉμΌλ‘ λ±λ‘νλ€.
λ€μν μ λ
Έν
μ΄μ
λ€μ΄ @Component
λ₯Ό μμλ°λλ€.
μ°Έκ³ : μλ°μλ μλ μ λ Έν μ΄μ κ°μ μμ κΈ°λ₯μ μ§μνμ§ μλλ€. μ΄λ μ€νλ§μμ μ§μνλ κΈ°λ₯μ΄λ€!
- @Component
- @Service
- @Repository
- @Controller
- @Configuration μμλ°λμ§ νμΈν΄λ³΄κ³ μΆμΌλ©΄ μ μ λ Έν μ΄μ μ μΈν°νμ΄μ€μ λ€μ΄κ°μ νμΈν΄λ³΄μ!
@ComponentScan
μ»΄ν¬λνΈ μ€μΊ
μ μμμ νμΈν μ»΄ν¬λνΈ μ λ
Έν
μ΄μ
νΉμ μμλ°μ μ λ
Έν
μ΄μ
λ€ μ€ 1κ°λΌλ λ±λ‘λ ν΄λμ€λ₯Ό μ°ΎμΌλ©΄ Contextμ λΉμΌλ‘ λ±λ‘νλ€.
λ§ κ·Έλλ‘ μ»΄ν¬λνΈ μ λ
Έν
μ΄μ
μ΄ λΆμ ν΄λμ€λ₯Ό μ€μΊνκ³ λΉμΌλ‘ λ±λ‘ν΄μ€λ€.
@Bean
@Bean
μ λ
Έν
μ΄μ
μ κ°μ²΄λ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘νκΈ° μν΄ μ¬μ©νλ€.
@Controller
μ΄ μ λ Έν μ΄μ μ΄ λΆμ ν΄λμ€κ° β컨νΈλ‘€λ¬μ μν μ νλ€βλΌκ³ λͺ μν΄μ€.
@Autowired
μ€νλ§μμ λΉ κ°μ²΄λ₯Ό μ£Όμ λ°κΈ° μν λ°©μμ΄ 3κ°μ§κ° μ‘΄μ¬νλ€.
- @Autowired
- μμ±μ
- setter
μ 3κ°μ§ λ°©λ² μ€ νλλ‘, @Autowired
κ° λΆμ ν΄λμ€λ₯Ό νμ
μ νμΈνκ³ (μμΌλ©΄ λΉ μ΄λ¦μ νμΈ) λΉμ μ£Όμ
νλ€.
@GetMapping
RequestMapping(Method=RequestMethod.GET)κ³Ό λκ°μ μν μ΄λ€.
@Controller // μ΄ Classλ Controller μν μ ν©λλ€
@RequestMapping("/user") // μ΄ Classλ /userλ‘ λ€μ΄μ€λ μμ²μ λͺ¨λ μ²λ¦¬ν©λλ€.
public class UserController {
@GetMapping("/")
public String getUser(Model model) {
// GET method, /user μμ²μ μ²λ¦¬
}
// μλ΅
}
μμ κ°μ΄ λμνκ³ , Flaskμμ @app.route(β/β, methods=[βGETβ])κ³Ό μ μ¬ν κ² κ°λ€.
@PostMapping
RequestMapping(Method=RequestMethod.POST)κ³Ό λκ°μ μν μ΄λ€.
@Controller // μ΄ Classλ Controller μν μ ν©λλ€
@RequestMapping("/user") // μ΄ Classλ /userλ‘ λ€μ΄μ€λ μμ²μ λͺ¨λ μ²λ¦¬ν©λλ€.
public class UserController {
@RequestMapping(method = RequestMethod.POST)
public String addUser(Model model) {
// POST method, /user μμ²μ μ²λ¦¬
}
// μλ΅
}
μμ κ°μ΄ λμνλ©°, Flaskμμ @app.route(β/β, methods=[βPOSTβ])μ λΉμ·ν κ² κ°λ€.
@Test
JUnitμμ ν μ€νΈ μ½λλ₯Ό μμ±ν λ μ¬μ©νλ€.
@RequestBody
μ΄ μ΄λ
Έν
μ΄μ
μ΄ λΆμ νλΌλ―Έν°μλ httpμμ²μ λ³Έλ¬Έ(body)μ΄ κ·Έλλ‘ μ λ¬λλ€.
μΌλ°μ μΈ GET/POSTμ μμ² νλΌλ―Έν°λΌλ©΄ @RequestBodyλ₯Ό μ¬μ©ν μΌμ΄ μμ κ²μ΄λ€.
λ°λ©΄μ xmlμ΄λ jsonκΈ°λ°μ λ©μμ§λ₯Ό μ¬μ©νλ μμ²μ κ²½μ°μ μ΄ λ°©λ²μ΄ λ§€μ° μ μ©νλ€.
HTTP μμ²μ λ°λλ΄μ©μ ν΅μ§Έλ‘ μλ°κ°μ²΄λ‘ λ³νν΄μ 맀νλ λ©μλ νλΌλ―Έν°λ‘ μ λ¬ν΄μ€λ€.
μ¦, ν΄λΌμ΄μΈνΈμμ μλ²λ‘ νμν λ°μ΄ν°λ₯Ό μμ²νκΈ° μν΄ JSON λ°μ΄ν°λ₯Ό μμ² λ³Έλ¬Έμ λ΄μμ μλ²λ‘ 보λ΄λ©΄, μλ²μμλ @RequestBody μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ HTTP μμ² λ³Έλ¬Έμ λ΄κΈ΄ κ°λ€μ μλ°κ°μ²΄λ‘ λ³νμμΌ, κ°μ²΄μ μ μ₯νλ€.
@ResponseBody
μλ°κ°μ²΄λ₯Ό HTTPμμ²μ λ°λλ΄μ©μΌλ‘ 맀ννμ¬ ν΄λΌμ΄μΈνΈλ‘ μ μ‘νλ€.
@ResponseBody κ° λΆμ νλΌλ―Έν°κ° μμΌλ©΄ HTTPμμ²μ λ―Έλμ΄νμ
κ³Ό νλΌλ―Έν°μ νμ
μ λ¨Όμ νμΈνλ€.
μ¦, @Responsebody μ λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ httpμμ² bodyλ₯Ό μλ° κ°μ²΄λ‘ μ λ¬λ°μ μ μλ€.
μλ²μμ ν΄λΌμ΄μΈνΈλ‘ μλ΅ λ°μ΄ν°λ₯Ό μ μ‘νκΈ° μν΄ @ResponseBody μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ μλ° κ°μ²΄λ₯Ό HTTP μλ΅ λ³Έλ¬Έμ κ°μ²΄λ‘ λ³ννμ¬ ν΄λΌμ΄μΈνΈλ‘ μ μ‘νλ€.
@RestController
@Controller + @ResponseBodyμ κ°μ κ°λ
μ΄λ€.
λ, @RestControllerκ° μμΌλ©΄ return "λ¬Έμμ΄";
λ‘ νλ©΄ μΉλΈλΌμ°μ μ λ¬Έμμ΄
μ΄ μΆλ ₯λλ€.
Flaskμμ @app.route(β/β)μ΄ λΆμ ν¨μ 리ν΄κ°μ return βhelloβλ₯Ό μ
λ ₯νλ©΄ μΉ λΈλΌμ°μ μ βhelloβκ° μΆλ ₯λλ κ²κ³Ό λΉμ·ν΄λ³΄μ.
@RequestParam
@ReuqestParam
μ΄λ
Έν
μ΄μ
μ HttpServletRequest
κ°μ²΄μ κ°μ μν μ νλ€.
HttpServletRequest
μμλ getParameter()
λ©μλλ₯Ό μ΄μ©νμ§λ§, @RequestParam
μ μ΄μ©ν΄μ λ°μμ€λ λ°©λ²λ μλ€.
[νμ]
@RequestParam("κ°μ Έμ¬ λ°μ΄ν°μ μ΄λ¦") [λ°μ΄ν°νμ
] [κ°μ Έμ¨λ°μ΄ν°λ₯Ό λ΄μ λ³μ]
LomBok μ¬μ© μ, μ λ Έν μ΄μ
@RequiredArgsConstructor
finalμ΄ λΆκ±°λ @NotNull μ΄ λΆμ νλμ μμ±μλ₯Ό μλ μμ±ν΄μ£Όλ 둬볡 μ΄λ
Έν
μ΄μ
μ΄λ€.
μ΄ μ λ
Έν
μ΄μ
μ μ¬μ©νμ§ μμΌλ©΄, μμ±μ μ£Όμ
μ½λλ₯Ό μ§μ μμ±ν΄μΌ νλλ° μ’ λ²κ±°λ‘λ€.
@Service
@RequiredArgsConstructor
public class BannerServiceImpl implements BannerService {
private final BannerRepository bannerRepository;
private final CommonFileUtils commonFileUtils;
// μλ΅
μμ κ°μ΄ λμνκ³ , final
μ΄ λΆμ νλμ μμ±μλ₯Ό μλμΌλ‘ μμ±ν΄μ€λ€.
λκΈλ¨κΈ°κΈ°