클라우드 융합 Full-stack 웹 개발자 양성과정/헷갈리는 부분 정리 📋

🐌스프링에서 자주쓰는 어노테이션(@) 정리

thesunset 2022. 12. 22. 11:12

@Component

개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation  

Spring은 해당 Annotation을 보고 Spring의 Bean으로 등록합니다.

- MVC패턴에 맞게 구체적으로 등록 가능

@Controller

Spring에게 해당 Class가 Controller의 역할을 한다고 명시하기 위해 사용하는 Annotation

Controller 빈 스캐닝을 통해 자동으로 빈 등록

- 예제) 

@Controller //Controller타입의 어노테이션을 붙여주면 BeanScanning을 통해서 자동으로 bean등록 
public class MemberController {

@Service

Service Class에서 쓰인다.
비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도이다

Component보다 더 구체화해서 Service bean으로 등록

- 예제)

@Service //Component보다 더 구체적
public class MemberServiceImpl implements MemberService {

@Repository

DAO class에서 쓰인다.
DataBase에 접근하는 method를 가지고 있는 Class에서 쓰인다.

주로 DB(저장소)와 관련된 작업("영속성"작업을 처리하겠다라는 뜻)

- 예제

@Repository
public class MemberDao {

@RequestMapping

@RequestMapping(value=”“)와 같은 형태로 작성하며, 요청 들어온 URI의 요청과 Annotation value 값이 일치하면 해당 클래스나 메소드가 실행 Controller 객체 안의 메서드와 클래스에 적용 가능, value생략 가능("")

HandlerMapping 등록

  • Class 단위에 사용하면 하위 메소드에 모두 적용
  • 메소드에 적용되면 해당 메소드에서 지정한 방식으로 URI를 처리

- 예제) 

- value O

@RequestMapping(value="login.me")
public ModelAndView loginMember(Member m, 
                                ModelAndView mv, 
                                HttpSession session) {

- value X

@RequestMapping("logout.me")
public String logoutMember(HttpSession session) {

@RequestParam

URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜, 파라미터를 받아서 처리할 수 있는 Annotation으로 아래와 같이 사용합니다. Json 형식의 Body를 MessageConverter를 통해 Java 객체로 변환시킵니다.

- @RequestParam어노테이션을 이용하는 방법 

request.getParameter("key")로 value를 뽑아오는 역할을 대신해주는 어노테이션
value속성의 값으로 jsp에서 작성했던 name속성값을 담으면 알아서 해당 매개변수를 받아올 수 있다. 
만약, 넘어온 값이 비어있는 형태라면 defaultValue속성으로 기본값을 지정할 수 있다.

@RequestMapping("login.me")
public String loginMember(@RequestParam(value = "id", defaultValue="aaa") String userId, @RequestParam(value="pwd")String userPwd) {

    System.out.println("userId : " + userId);
    System.out.println("userPwd : " + userPwd);
    return "main";

}

- @RequestParam 어노테이션을 생략하는 방법

단, 매개변수명을 jsp의 name속성값(요청 시 전달하는 값의 키값)과 동일하게 세팅해둬야 자동으로 값이 주입
단점으로는 위에서 사용했던 defaultValue속성은 사용할 수 없음

@RequestMapping("login.me")
public String loginMember(String id, String pwd) {

    System.out.println("userId : " + id);
    System.out.println("userPwd : " + pwd);

    Member m = new Member();

    m.setUserId(id);
    m.setUserPwd(pwd);

    //Service쪽 메소드에 m을 전달하면서 조회
    return "main";
}

 

@Autowired

Bean을 주입받기 위하여 @Autowired 를 사용,  Spring Framework가 Class를 보고 Type에 맞게(Type을 먼저 확인 후, 없으면 Name 확인) Bean을 주입

: D.I(Dependency Injection)응 이용하기 위해 달아놓음

- 예제 

@Autowired
private MemberDao memberDao;

//sqlSessionTemplate객체를 사용해서 bean등록을 했었음
@Autowired
private SqlSessionTemplate sqlSession;

* 참고 : Bean을 주입받는 3가지 

  1. @Autowired
  2. setter
  3. 생성자 (@AllArgsConstructor 사용) -> 권장방식

@ModelAttribute

: 요청 시 전달값을 담고자하는 VO클래스의 타입을 세팅

@RequestMapping("login.me")
public String loginMember(@ModelAttribute Member m) {
	
	Member loginUser = memberService.loginMember(m);
	
	if(loginUser == null) { // 로그인 실패 => 에러문구를 requestScopet에 담고 에러페이지로 포워딩
		System.out.println("로그인 실패");
	} else { // 로그인 성공 => loginUser를 sessionScopet에 담고 메인페이지 url로 재요청
		System.out.println("로그인 성공");
	}		
			
	return "main";
}

@ResponseBody

: 리턴하는 String타입이 응답 뷰 정보가 아니라 응답데이터라는 것을 선언

@ResponseBody // 데이터를 돌려보낼 때
@RequestMapping("idCheck.me")
public String idCheck(String checkId) { // 키값을 적어주기
	int count = memberService.idCheck(checkId);
	if (count > 0) { // 이미 존재하는 아이디 => 사용불가 (NNNNN)
	  return "NNNNN";
	} else { // 시용 가능 (NNNNY)
		return "NNNNY";
	}
}