• ABOUT
  • POSTS
  • GUESTBOOK

ยฉ 2025 BlueCool12 All rights reserved.

2025.09.07Spring

๐Ÿงฉ Spring Bean ๋“ฑ๋ก ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ: @Component๋ถ€ํ„ฐ @Mapper๊นŒ์ง€

Spring์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜๋“ค์ด ์žˆ๋‹ค. @Component, @Controller, @Service ๋“ฑ์ธ๋ฐ ๊ฐ๊ฐ์˜ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. 
 


1) @Component 

@Component๋Š” Spring์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก์šฉ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋…๋ฆฝ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋Š” Spring์˜ ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋Œ€์ƒ์ด ๋˜์–ด ์ž๋™์œผ๋กœ Bean์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค. 
 

Spring Bean ์ด๋ž€? 

Spring IoC Container๊ฐ€ ์ƒ์„ฑํ•˜๊ณ  ์ƒ๋ช… ์ฃผ๊ธฐ๊นŒ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ new๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  Spring์ด ๋Œ€์‹  ์ƒ์„ฑํ•ด ์ค€ ๊ฐ์ฒด(Bean)์„ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 


์‚ฌ์‹ค ๋‚˜๋จธ์ง€ ์–ด๋…ธํ…Œ์ด์…˜(@Controller, @Service ๋“ฑ๋“ฑ)์€ ๋ชจ๋‘ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” @Component๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํŠน์ˆ˜ํ™” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์ฆ‰ ์ „๋ถ€ @Component์ฒ˜๋Ÿผ Spring์ด ์ž๋™์œผ๋กœ Bean์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. 

์•„๋ž˜๋Š” @Service ์–ด๋…ธํ…Œ์ด์…˜์˜ ์‹ค์ œ ์ฝ”๋“œ์ด๋‹ค. 

java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
  /**
   * Alias for {@link Component#value}.
   */
  @AliasFor(annotation = Component.class)
  String value() default "";
}


ํ•˜์ง€๋งŒ ๊ตณ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ณ  ๊ฐ ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ๋ถ„๋ช…ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. 

๊ณ„์ธต์— ๋”ฐ๋ผ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ์—ญํ• ์— ๋”ฐ๋ฅธ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” AOP๋ฅผ ์ ์šฉํ•  ๋•Œ๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋„ ์œ ๋ฆฌํ•˜๊ฒŒ ์ž‘์šฉํ•œ๋‹ค. 
 

2) @Controller & @RestController

@Controller๋Š” ์ „ํ†ต์ ์ธ Spring MVC ํŒจํ„ด์—์„œ ์›น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  View(JSP, Thymeleaf ๋“ฑ)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. 

์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Model์— ๋‹ด์•„ View๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 
 

java
@Controller
public class MainController {
  
  @GetMapping("/")
  public String home(Model model) {
    model.addAttribute("msg", "Hello World");
    return "home"; // home.html ํ˜น์€ home.jsp View ๋ Œ๋”๋ง
  }
}


๋ฐ˜๋ฉด @RestController๋Š” @Controller์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ @ResponseBody๊ฐ€ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์–ด ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ View๊ฐ€ ์•„๋‹Œ JSON์ด๋‚˜ XML๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 
 

java
@RestController
public class ApiController {
  
  @GetMapping("/api/hello")
  public String hello() {
    return "Hello I'm BlueCool"; // ๋ฌธ์ž์—ด์ด ๊ทธ๋Œ€๋กœ HTTP ์‘๋‹ต ๋ณธ๋ฌธ์œผ๋กœ ์ „์†ก๋จ
  }
}


๋”ฐ๋ผ์„œ @Controller๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๊ณ  @RestController๋Š” RESTful API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ(React, Vue ๋“ฑ)์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. 
 

3) @Service

@Service๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋กœ์ง(ํšŒ์› ๊ฐ€์ž…, ์•Œ๋ฆผ ๋ฐœ์†ก ๋“ฑ)์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ตฌ์ฒด์ ์ธ ๋กœ์ง์€ @Service ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•œ๋‹ค. 
 

java
@Service
public class MemberService {
  
  public void registerMember(Member member) {
    // ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ ๋กœ์ง
  }
}


@Service๋Š” ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง„ ์•Š์ง€๋งŒ ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต(Service Layer)์ž„์„ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค. 

๋˜ํ•œ AOP(Pointcut)๋ฅผ ์ ์šฉํ•  ๋•Œ @Service๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋งŒ์„ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ๋œ๋‹ค. 
 

4) @Repository & Mapper

@Repository๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์„ ๋‹ด๋‹นํ•˜๋Š” DAO(Data Access Object) ํด๋ž˜์Šค์— ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. @Repository๋Š” ๋‹ค๋ฅธ ์–ด๋…ธํ…Œ์ด์…˜๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ Spring์ด ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์˜ˆ์™ธ๋ฅผ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ๋‹ค. 

์ฆ‰ SQLException๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ Spring์€ ์ด๋ฅผ DataAccessException์œผ๋กœ ๊ฐ์‹ธ์„œ ๋˜์ ธ์ค€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด DB ๋ฒค๋”์— ๋…๋ฆฝ์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 
 

java
@Repository
public class MemberRepository {
  
  @Autowired
  private JdbcTemplate jdbcTemplate;
  
  public Member findById(Long id) {
    String sql = "SELECT * FROM members WHERE id = ?";
    return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Member.class), id);
  }
}


MyBatis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” DAO ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— @Mapper ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ SQL๊ณผ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. 

์ฆ‰ @Mapper๊ฐ€ ๋ถ™์€ ์ธํ„ฐํŽ˜์ด์Šค ์—ญ์‹œ DAO ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋ฉฐ Spring์ด ์ž๋™์œผ๋กœ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด Bean์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค. 
 

java
@Mapper
public interface MemberMapper {

  @Select("SELECT * FROM members WHERE id = #{id}")
  Member findById(@Param("id") Long id);
}


@Mapper ์—ญ์‹œ ๋‚ด๋ถ€์ ์œผ๋กœ Spring์˜ ์˜ˆ์™ธ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์ด ์ ์šฉ๋˜์–ด ์žˆ์–ด ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” SQLException ๋“ฑ์˜ ์˜ˆ์™ธ๋ฅผ DataAccessException ๊ณ„์—ด๋กœ ๋ณ€ํ™˜ํ•ด ์ค€๋‹ค. 
 



Spring์—์„œ ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋‹จ์ˆœํžˆ Bean์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•จ๋„ ์žˆ์ง€๋งŒ ๊ณ„์ธต๋ณ„ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„๊ณ  ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. 

๋”ฐ๋ผ์„œ ๊ฐ ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ณ„์ธต ๊ตฌ์กฐ์™€ ์ฑ…์ž„ ๋ถ„๋ฆฌ๋ผ๋Š” ๊ด€์ ์—์„œ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค. 

์ด์ „ ๊ธ€
๐Ÿค ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ๊ฐ€์ด๋“œ
๋‹ค์Œ ๊ธ€
๐Ÿ“‹ ์ž๋ฐ”๋กœ ์ดํ•ดํ•˜๋Š” ์–•์€ ๋ณต์‚ฌ & ๊นŠ์€ ๋ณต์‚ฌ
์žฅ์‹์šฉ ๋กœ๊ณ