ResponseEntity<?>는 뭘까?
Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재한다.
HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스
HttpEntity 클래스를 상속받아 구현한 클래스가 RequestEntity, ResponseEntity 클래스이다.
ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다.
따라서 HttpStatus, HttpHeaders, HttpBody를 포함한다.
단순히 데이터만을 보내기보단 상태와 메세지 데이터까지 모두 보낼 수 있음
@GetMapping(value = "/user/{id}")
public ResponseEntity<Message> findById(@PathVariable int id) {
User user = userDaoService.findOne(id);
Message message = new Message();
HttpHeaders headers= new HttpHeaders();
headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
message.setStatus(StatusEnum.OK);
message.setMessage("성공 코드");
message.setData(user);
return new ResponseEntity<>(message, headers, HttpStatus.OK);
}
ResponseEntity<?>라고 해줘서 Type을 제네릭으로 할 수 있음
@GetMapping("")
public ResponseEntity<?> selectAll() {
try {
List<Board> boards = service.selectAll();
return new ResponseEntity<List<Board>>(boards, HttpStatus.OK);
} catch (SQLException e) {
return new ResponseEntity<String>("Error : " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@Controller @RestController
- @Controller는 View, Data를 반환하기 위해 사용
- @RestController는 @Controller에 @ResponseBody가 추가된 것
- 당연하게도 RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것
- 최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환
- 이러한 이유로 동작 과정 역시 @Controller에 @ReponseBody를 붙인 것과 완벽히 동일
- RestController를 붙이면, 컨트롤러 클래스 하위 메서드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON 등을 전송
@RequestBody
HTTP 요청의 본문(body)이 그대로 전달된다.
일반적인 GET/POST의 요청 파라미터라면 @RequestBody를 사용할 일이 없을 것이다.
반면에 xml이나 json기반의 메시지를 사용하는 요청의 경우에 이 방법이 매우 유용하다.
HTTP 요청의 바디내용을 통째로 자바객체로 변환해서 매핑된 메소드 파라미터로 전달해준다.
@GetMapping("/hello")
public String hello(@RequestBody String temp){
return temp;
}
넘겨주는 Json의 key값이 DTO의 변수명과 일치하게 된다면 자동으로 들어가게 된다
@GetMapping("/hello")
public String hello(@RequestBody User user){
return user.toString();
}
@ResponseBody
자바객체를 HTTP요청의 바디내용으로 매핑하여 클라이언트로 전송
public String helloWorld() {
return "helloworld";
}
위의 코드를 @ResponseBody 없이 그냥 보내면 helloworld.jsp를 호출하게 되는데 데이터 자체를 보내고 싶을 땐 @ResponseBody가 필수
@RequestMapping("/board")
우리는 특정 uri로 요청을 보내면 Controller에서 어떠한 방식으로 처리할지 정의를 한다.
이때 들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 것이 @RequestMapping이다.
하지만 공통적인 url은 상단에 빼놓고 GET POST PUT DELETE에 따른 요청은 각각 Mapping()으로 대체한다
@RestController
@RequestMapping(value = "/hello")
public class HelloController {
@GetMapping()
public String helloGet(...) {
...
}
@PostMapping()
public String helloPost(...) {
...
}
@PutMapping()
public String helloPut(...) {
...
}
@DeleteMapping()
public String helloDelete(...) {
...
}
}
@AllArgsConstructor //여기에 필드에 쓴 모든생성자만 만들어줌
@NoArgsConstructor //기본 생성자를 만들어줌
@Data // getter, setter 만들어줌
이거 맞나? 확인해봐야됨
그런데 모든 생성자 중에 내가 몇가지는 값을 안넣어서 사용할 수 있는데 그런 경우는 어떻게 할까?
안넣은 것이 null값으로 들어가도 에러가 안난다
왜냐면 mapper.xml에서 필요한 것만 update하기 때문임
<update id="updateInfo">
update USERS set email=#{email}, birthyear=#{birthyear}, birthday=#{birthday}, mobile=#{mobile}
where id=#{id}
</update>
userDTO에 여러가지 필드가 있는데 값이 들어오는 것들만 update해줄꺼기 때문에 괜찮다
이렇게 사용하거나 아니면 일일히 매개변수 수 맞게 생성자 만들어주기!
@Autowired
스프링에서 빈 인스턴스가 생성된 이후 @Autowired를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입
즉, 해당 변수 및 메서드에 스프링이 관리하는 Bean을 자동으로 매핑해주는 개념
Case 1 ) http://xxx.x.x?index=1&page=2
(파라미터의 값과 이름을 함께 전달, 게시판 등에서 페이지 및 검색 정보를 함께 전달하는 방식)
==> @RequestParam
Case 2 ) http://xxxx.x.x/index/1
(Rest API 에서 값 호출할 때 많이 사용)
==> @PathVariable
@RequestParam
==> 기본적으로 @RequestParam 은 url 상에서 데이터를 찾음
ex) /getDriver?name="name에 담긴 value"
위의 경우 url이 전달될 때 name 파라미터(name에 담긴 value)를 받아오게 되며
즉, @RequestParam("실제 값") String 설정할 변수 이름
https://localhost/test/hi/hello?id=jiwon&pwd=1234
@RestController
@RequestMapping("hi")
public class HelloController {
@GetMapping("/hello")
public String hello(@RequestParam("id") String id, @RequestParam("pwd") String pwd){
return id + " " + pwd;
}
}
jiwon 1234 <<이렇게 리턴
@GetMapping("/hello")
public String hello(@RequestParam String id){
return id + " ";
}
key와 매개변수 변수명이 똑같으면 @RequestParam("실제 값") 말고 @RequestParam 그대로 써도됨
변수명과 url의 key 값이 똑같이 되어있다면 DTO에 한번에 받기가 가능
@GetMapping("/hello")
public String hello(User user){
return user.toString();
}
만약파라미터가 많아지게 되면 ?
파라미터가 많아지게 된다면 일일이 파라미터를 지정하는게 귀찮아져서 이럴때는 Map으로 간단하게 받아올 수 있다.
localhost/test/hi/hello?id=jiwon&pwd=1234
@GetMapping("/hello")
public String hello(@RequestParam Map<String, String> map){
return map.get("id") + map.get("pwd");
}
@PathVariable
REST API에서 URI에 변수가 들어가는걸 실무에서 많이 볼 수 있다.
예를 들면, 아래 URI에서 밑줄 친 부분이 @PathVariable로 처리해줄 수 있는 부분이다.
http://localhost:8080/api/user/1234
https://music.bugs.co.kr/album/4062464
Controller에서 아래와 같이 작성하면 간단하게 사용 가능하다.
- @GetMapping(PostMapping, PutMapping 등 다 상관없음)에 {변수명}
- 메소드 정의에서 위에 쓴 변수명을 그대로 @PathVariable("변수명")
- (Optional) Parameter명은 아무거나 상관없음(아래에서 String name도 OK, String employName도 OK)
@GetMapping("/hello/{temp}")
public String hello(@PathVariable("temp") String temp123){
System.out.println("응애");
return temp123;
}
@PathVariable()에 쓴 변수와 @GetMapping()의 {}변수와 일치시키고 그 변수를 String temp123이란 변수에 저장해서 쓰겠다는 의미!
** url과 RequestBody 모두 사용하는 법
@RestController
@RequestMapping("hi")
public class HelloController {
@GetMapping("/hello")
public String hello(User user, @RequestBody User user2){
return user.toString() + " " + user2.toString();
}
}
@RequestPart
@CrossOrigin("*")
@Transactional
@RequiredArgsConstructor
@Configuration
@Bean
@Builder
@PageableDefault
@Valid
@Id
@GeneratedValue
@Primary
@Qualifier
implementation compileOnly runtimeOnly
Lombok Constructor
@NoArgsConstructor | 파라미터가 없는 기본 생성자를 생성 |
@AllArgsConstructor | 모든 필드 값을 파라미터로 받는 생성자를 만듦 |
@RequiredArgsConstructor | final이나 @NonNull인 필드 값만 파라미터로 받는 생성자 만듦 |
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
@NonNull
private String name;
@NonNull
private String pw;
private int age;
}
User user1 = new User(); // @NoArgsConstructor
User user2 = new User("user2", "1234"); // @RequiredArgsConstructor
User user3 = new User(1L, "user3", "1234", null); // @AllArgsConstructor
'Backend > Spring' 카테고리의 다른 글
[JPA] Entity 만들기 (0) | 2023.04.24 |
---|---|
[Spring Security] BBKK에서 썼던 로그인 관련 정리 ★★★ (0) | 2023.04.13 |
프로젝트 회고(BangBangGokGok) (0) | 2023.04.07 |
프로젝트 회고(경매중) + 질문 리스트 (1) | 2023.02.20 |
[Spring Security] SecurityConfig 작성 (version. Jiwon) (0) | 2023.01.25 |