Spring์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ ํ๊ฒ ๋๋ ์ด๋
ธํ
์ด์
๋ค์ด ์๋ค. @Component, @Controller, @Service ๋ฑ์ธ๋ฐ ๊ฐ๊ฐ์ ์ด๋
ธํ
์ด์
๋ค์ ๊ณตํต์ ๊ณผ ์ฐจ์ด์ ์ ๋ํด ์์๋ณด์.
@Component๋ Spring์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ปดํฌ๋ํธ ๋ฑ๋ก์ฉ ์ด๋
ธํ
์ด์
์ด๋ค. ์ปดํฌ๋ํธ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ๋ ๋
๋ฆฝ์ ์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋จ์๋ฅผ ์๋ฏธํ๋ค.
์ด ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ Spring์ ์ปดํฌ๋ํธ ์ค์บ ๋์์ด ๋์ด ์๋์ผ๋ก Bean์ผ๋ก ๋ฑ๋ก๋๋ค.
Spring Bean ์ด๋?
Spring IoC Container๊ฐ ์์ฑํ๊ณ ์๋ช ์ฃผ๊ธฐ๊น์ง ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค. ๊ฐ๋ฐ์๊ฐ ์ง์ new๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ Spring์ด ๋์ ์์ฑํด ์ค ๊ฐ์ฒด(Bean)์ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
์ฌ์ค ๋๋จธ์ง ์ด๋
ธํ
์ด์
(@Controller, @Service ๋ฑ๋ฑ)์ ๋ชจ๋ ๋ด๋ถ์ ์ผ๋ก๋ @Component๋ฅผ ํฌํจํ๊ณ ์๋ ํน์ํ ์ด๋
ธํ
์ด์
์ด๋ค. ์ฆ ์ ๋ถ @Component์ฒ๋ผ Spring์ด ์๋์ผ๋ก Bean์ผ๋ก ๋ฑ๋กํ์ฌ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
์๋๋ @Service ์ด๋
ธํ
์ด์
์ ์ค์ ์ฝ๋์ด๋ค.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
/**
* Alias for {@link Component#value}.
*/
@AliasFor(annotation = Component.class)
String value() default "";
}
ํ์ง๋ง ๊ตณ์ด ์ด๋
ธํ
์ด์
์ ๊ตฌ๋ถํด์ ์ฌ์ฉํ๋ ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ช
ํํ ๊ตฌ๋ถํ๊ณ ๊ฐ ํด๋์ค์ ์ญํ ์ ๋ถ๋ช
ํ๊ฒ ํํํ๊ธฐ ์ํจ์ด๋ค.
๊ณ์ธต์ ๋ฐ๋ผ ์ด๋
ธํ
์ด์
์ ๋ค๋ฅด๊ฒ ์ ์ฉํจ์ผ๋ก์จ ์ฝ๋์ ๊ฐ๋
์ฑ์ด ํฅ์๋๊ณ ์ญํ ์ ๋ฐ๋ฅธ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ AOP๋ฅผ ์ ์ฉํ ๋๋ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ์ ๋ฆฌํ๊ฒ ์์ฉํ๋ค.
@Controller๋ ์ ํต์ ์ธ Spring MVC ํจํด์์ ์น ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ View(JSP, Thymeleaf ๋ฑ)๋ฅผ ๋ฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด๋
ธํ
์ด์
์ด๋ค.
์ด ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Model์ ๋ด์ View๋ก ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค.
@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๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ํํ๋ก ๋ฐํํ๋ค.
@RestController
public class ApiController {
@GetMapping("/api/hello")
public String hello() {
return "Hello I'm BlueCool"; // ๋ฌธ์์ด์ด ๊ทธ๋๋ก HTTP ์๋ต ๋ณธ๋ฌธ์ผ๋ก ์ ์ก๋จ
}
}
๋ฐ๋ผ์ @Controller๋ ์ผ๋ฐ์ ์ผ๋ก ํ
ํ๋ฆฟ ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ๋๊ณ @RestController๋ RESTful API ์๋ฒ๋ฅผ ๊ฐ๋ฐํ ๋ ํด๋ผ์ด์ธํธ(React, Vue ๋ฑ)์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉ๋๋ค.
@Service๋ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ํด๋์ค์ ์ฌ์ฉ๋๋ ์ด๋
ธํ
์ด์
์ด๋ค. ์๋ฅผ ๋ค์ด ์ปจํธ๋กค๋ฌ์์ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํด์ผ ํ๋ ๋ก์ง(ํ์ ๊ฐ์
, ์๋ฆผ ๋ฐ์ก ๋ฑ)์ด ์๋ค๋ฉด ๊ทธ ๊ตฌ์ฒด์ ์ธ ๋ก์ง์ @Service ํด๋์ค์์ ๊ตฌํํ๋ค.
@Service
public class MemberService {
public void registerMember(Member member) {
// ํ์๊ฐ์
์ฒ๋ฆฌ ๋ก์ง
}
}
@Service๋ ํน๋ณํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ง๋ง ๋น์ฆ๋์ค ๊ณ์ธต(Service Layer)์์ ๋ช
ํํ ํํํด ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ์ ์ง ๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋ค.
๋ํ AOP(Pointcut)๋ฅผ ์ ์ฉํ ๋ @Service๊ฐ ๋ถ์ ํด๋์ค๋ง์ ๋์์ผ๋ก ์ง์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ก๊น
, ํธ๋์ญ์
๊ด๋ฆฌ ๋ฑ์์ ์ ์ฉํ๊ฒ ํ์ฉ๋๋ค.
@Repository๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋์ ๋ด๋นํ๋ DAO(Data Access Object) ํด๋์ค์ ์ฌ์ฉํ๋ ์ด๋
ธํ
์ด์
์ด๋ค. @Repository๋ ๋ค๋ฅธ ์ด๋
ธํ
์ด์
๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ Spring์ด ์๋์ผ๋ก ๋ฐ์ดํฐ ์ ๊ทผ ์์ธ๋ฅผ ๋ณํํด ์ฃผ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด ์๋ค.
์ฆ SQLException๊ณผ ๊ฐ์ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ Spring์ ์ด๋ฅผ DataAccessException์ผ๋ก ๊ฐ์ธ์ ๋์ ธ์ค๋ค. ์ด๋ฅผ ํตํด DB ๋ฒค๋์ ๋
๋ฆฝ์ ์ธ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
@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์ผ๋ก ๋ฑ๋กํ๋ค.
@Mapper
public interface MemberMapper {
@Select("SELECT * FROM members WHERE id = #{id}")
Member findById(@Param("id") Long id);
}
@Mapper ์ญ์ ๋ด๋ถ์ ์ผ๋ก Spring์ ์์ธ ๋ณํ ๊ธฐ๋ฅ์ด ์ ์ฉ๋์ด ์์ด ๋ฐ์ดํฐ ์ ๊ทผ ์ค ๋ฐ์ํ๋ SQLException ๋ฑ์ ์์ธ๋ฅผ DataAccessException ๊ณ์ด๋ก ๋ณํํด ์ค๋ค.
Spring์์ ์ด๋
ธํ
์ด์
์ ๊ตฌ๋ถํด์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋จ์ํ Bean์ ๋ฑ๋กํ๊ธฐ ์ํจ๋ ์์ง๋ง ๊ณ์ธต๋ณ ์ฑ
์์ ๋ช
ํํ ๋๋๊ณ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
๋ฐ๋ผ์ ๊ฐ ์ด๋
ธํ
์ด์
์ ๊ณ์ธต ๊ตฌ์กฐ์ ์ฑ
์ ๋ถ๋ฆฌ๋ผ๋ ๊ด์ ์์ ์ดํดํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด Spring ์ ํ๋ฆฌ์ผ์ด์
์ ๋ ์ ์ง ๋ณด์ํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ก ๋ง๋ค์ด ์ค๋ค.
