[SpringBoot] Controller

정재현·2024년 1월 22일
0

Spring Boot

목록 보기
13/19
post-thumbnail

Controller

들어온 요청을 처리해주는 역할

자주사용되는 SpringBoot 애너테이션 종류

@Controller : 해당 Class가 Conroller의 역할을 수행할 수 있도록 등록
@GET : 데이터 확인 요청
@POST : 데이터 등록 요청
@PUT : 데이터 수정 요청
@DELETE : 데이터 삭제 요청
@RequestMapping : 중복되는 URL 생략


Controller의 장점

만약 다음과 같이 4개의 API가 존재한다고 할 때 Spring MVC에 Front Controller 패턴이 적용되어 있지 않다면 4개의 API를 처리하기 위해 3개의 클래스와 4개의 메서드를 구현해야 한다.

// @WebServlet이라는 애너테이션을 이용해 urlPatterns를 주면 해당 URL로 요청이 올 경우 해당 메서드로 매핑

@WebServlet(urlPatterns = "/user/login")
public class UserLoginServlet extends HttpServlet {
	@Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}
}
@WebServlet(urlPatterns = "/user/logout")
public class UserLogoutServlet extends HttpServlet {
	@Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}
}
@WebServlet(urlPatterns = "/user/signup")
public class UserSingUpServlet extends HttpServlet {
	@Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}

	@Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}

}

Controller Code

Spring MVC는 효율적인 API 처리를 위해 Front Controller 패턴이 존재하기 때문에 API마다 파일을 만들 필요가 없다.

  • 보통 하나의 Controller에 모든 API를 넣지는 않고, 유사항 성격의 API를 하나의 Controller로 관리한다.
  • 메서드 이름도 내 마음대로 설정이 가능하다.
    • 단, 클래스 내의 중복메서드명 불가
@Controller
@RequestMapping("/user")
public class UserController {
	@GetMapping("/login")
	public String login() {
	    // ...
	}

  @GetMapping("/logout")
  public String logout() {
      // ...
  }

	@GetMapping("/signup")
	public String signup() { 
		// ... 
	}
	
	@PostMapping("/signup")
  public String registerUser(SignupRequestDto requestDto) {
		// ... 
	}
}

Controller 사용 방법

  • @Controller : 해당 클래스가 Controller의 역할을 수행할 수 있도록 등록
@Controller
public class HelloController {
    @GetMapping("/api/hello")
    @ResponseBody
    public String hello() {
        return "Hello World!";
    }
}

HTTP Method에 매핑되는 애너테이션

  • @GET : 데이터 요청
@GetMapping("/api/get")
@ResponseBody
public String get() {
    return "GET Method 요청";
}
  • @POST : 데이터 등록 요청
@PostMapping("/api/post")
@ResponseBody
public String post() {
    return "POST Method 요청";
}
  • @PUT : 데이터 수정 요청
@PutMapping("/api/put")
@ResponseBody
public String put() {
    return "PUT Method 요청";
}
  • @DELETE : 데이터 삭제 요청
@DeleteMapping("/api/delete")
@ResponseBody
public String delete() {
    return "DELETE Method 요청";
}

중복되는 URL를 단축시키기

  • @RequestMapping : 중복되는 URL 생략
@Controller
@RequestMapping("/api")
public class HelloController {
    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello World!";
    }

    @GetMapping("/get")
    @ResponseBody
    public String get() {
        return "GET Method 요청";
    }

    @PostMapping("/post")
    @ResponseBody
    public String post() {
        return "POST Method 요청";
    }

    @PutMapping("/put")
    @ResponseBody
    public String put() {
        return "PUT Method 요청";
    }

    @DeleteMapping("/delete")
    @ResponseBody
    public String delete() {
        return "DELETE Method 요청";
    }
}

예시)

package com.sparta.springmvc.controller;

import org.springframework.stereotype.Controller;	// @Controller 사용
import org.springframework.web.bind.annotation.*;	// @ReauestMapping 사용

@Controller
@RequestMapping("/api")
public class HelloController {
    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello World";
    }

    @GetMapping("/get")
    @ResponseBody
    public String get() {
        return "GET Method 요청";
    }

    @PostMapping("/post")
    @ResponseBody
    public String post() {
        return "POST Method 요청";
    }

    @PutMapping("/put")
    @ResponseBody
    public String put() {
        return "PUT Method 요청";
    }

    @DeleteMapping("/delete")
    @ResponseBody
    public String delete() {
        return "DELETE Method 요청";
    }
}

정리하기

  • Controller는 들어온 요청을 처리해주는 역할
  • Spring의 애너테이션과 함께 많이 사용
  • 유지보수 및 협업을 위해 유사한 성격의 API들을 묶어서 하나의 Controller 클래스에 구현
  • @Controller 애너테이션을 사용할 때 String으로 반환을 하게 되면 resources파일 → templates 파일에서 HTML 파일을 찾아서 반환(View 내용을 전달하는 방식)
  • 애너테이션의 경로는 중복이 되어도 상관없지만, 메서드와 경로 모두가 중복이 되는건 안된다.
  • @ResponseBody : HTML로 반환되지 않고, 문자열 그대로 반환하도록 설정
  • @RequestMapping : 중복된 URL을 줄여줌

TIP

  • API 동작을 확인하기 위해 Postman을 이용해 테스트해보자
  • 실무에선 Swagger도 많이 사용한다.

profile
공부 기록 보관소

0개의 댓글