코드 그라데이션
20230210 CRUD 코드 관련 부연설명 본문
Controller단부터 쭉 훑기
Controller가 하는 일은 사용자로부터 요청을 받아서
적절한 서비스 로직을 불러내는 것!
@RestController = @Controller + @ResponseBody
보통 Controller에서 응답을 한다고 하면,
스프링은 그 응답을 HTML의 파일 이름으로 해석을 해요.
ex. 이런 메서드가 있다고 하면
public signup() {
return "siginup";
}
스프링은 일단 signup이라는 HTML 파일이 있는지를 찾는다.
그런데 우리가 HTML 파일로 보여주는 게 아니라 그냥 메시지만 출력해준다거나
그냥 이것 자체를 응답에 넣어라 라고 해주고 싶을 때가 있거든요.
그럴 때, @ResponseBody를 붙인다.
화면이 아니라 응답값 그 자체를...
이걸 매번 붙이기가 귀찮으니 class명 위에 @RestController 붙여서 퉁친다.
@RequestMapping
ex) @RequestMapping("/boards") 라고 하면
이 url 매핑을 기본으로 하고,
각각 메서드에 나와있는 url은 boards 뒤에 붙는 애들이라고 생각하면 된다.
ex) @PutMapping("/{boardsId}) 에서 {} 값이 무엇일까요?
PathVariable!
경로 중에 있는 변수라고 해서 그렇게 부르고 1, 2, 3 이렇게 증가하는 값
@RequestBody
: 요청 본문. 요청 본문에 어떠한 값들을 객체로 만들어서 가져오겠다. 뭐 요런 느낌.
UserDetails는 스프링 시큐리티랑 관련있는 것이었다.
* ResponseEntity
응답에는 두 가지가 있다
1. HTTP request
- method(POST, GET...)
- request parameter
...
2. HTTP response
- status code : 이 응답이 어떤 내용인지를 코드만 대략 보고 알 수 있게끔 만들어줌
=> 전세계적 웹 표준에 따라 정해져 있음. OK는 200...등
- response body
ResponseEntity란 2번 통째를 말하는 것
이제 DTO
사실 요청과 응답의 기준은 나 자신이라고 보면 됨.
내가 만약 서버다, 사용자가 나에게 요청을 하는 것이고 나는 응답을 주는 것이잖아요.
그래서 BoardResponseDto에 선언된(private~) 필드들은 사용자에게 돌려주는 값이 되는 거죠.
Board 엔티티를 가보면 UserId도 있고 다양한 값들이 있는데,
이런 것들 몇 개 빼고 필요한 것들만 사용자에게 넘기고 싶어,
그러면 소위 거름망으로 DTO를 활용할 수 있다.
이렇게 분리해놓아라.
이제 엔티티
Long 과 long의 차이
자바에서 대문자로 시작하는 것은 class
소문자로 시작하는 것은 기본 자료형
둘의 결정적인 차이는 null 값을 가질 수 있느냐 없느냐 여부
예를 들면,
private Long postId; 의 경우
id 자체가 0일 수도 있죠.
만약 이게
private long postId; 였다면,
누군가는
"아 지금 postId가 없나보다" 라고 생각할 수도 있고,
또 누군가는
"아 지금 postId가 0이란 소리구나" 라고 생각할 수도 있다.
즉, 받아들이기에 모호하다는 소리
enumerated를 들어가보면 EnumType의 디폴트 값은 ORDINAL이다.
객체에서의 enum은 데이터베이스 상에서 표현할 수 있는 방법이 두 가지다.
그래서 Long으로 선언해서 모호함을 없애버린다.
지금 필드에
private long userId; 가 있는데...
아래에서
@ManyToOne
@JoinColumn(name = "users_id")
private User user;
로 매핑되어있는게 있다.
즉, 중복 정의했다는 소리!
왜냐면 아래에서 User 객체를 통으로 가져와서 쓸 수 있게 만들어놓았는데,
굳이 필드에 userId를 따로 선언해줄 필요가 없다는 것이지.
그리고
@Enumerated(EnumType.STRING)
private Subject subject;
private enum subject {
공지사항, 동네사항
} 에서
지금 위랑 아래랑 다른 것이다(대소문자가 달라서) .. 그래서 빌드가 안되었었구나.
근데 enum도 결국 클래스의 하나이니까, 대문자로 바꿔주자.
private enum Subject {
공지사항, 동네사항
}
그리고 이렇게만 하면 공지사항 과 동네사항 이
내부적으로는 숫자 0과 1일 거거든요.
Enumerated를 눌러서 들어가보면 EnumType의 디폴트 값이 지금 ORDINAL
enum은 데이터베이스상에서 표현할 수 있는 방법이 두 가지가 있거든요.
1. ORDINAL : 숫자로 표현
2. STRING : 문자열로 표현
그래서 STRIMG 타입을 명시해주지 않으면 / 공지사항, 동네사항 이 아니라 0과 1로 저장된다.
enum 중간에 "우리집 사항" 같은 새로운 항목을 추가해버리면, 데이터베이스에서 저장할 때 엉켜서 난리 나버리겠지.
그리고 지금 자바 클래스 자체가 다르므로,
enum의 Subject 값이 private로 선언되어 있어서 값을 제대로 못 찾아오는 것 같아.
해결 방법 2가지.
1. enum 클래스를 하나 만들어서 동네사항, 공지사항을 거기다 넣는다(밖으로 빼는 거지)
2
인터페이스라는 건 저는 약속이라고 이해하는 게 제일 쉬운 것 같아요.
그러니까 "보드 서비스는 뭔지 모르겠지만 이 정도는 지켜줘야 보드 서비스라고 할 수 있어"
이런 걸 딱 나열해놓은 거예요.
"근데 그걸 어떻게 구현할지는 네가 알아서 해" 하고 이렇게 여기선 스펙만 나열한 거예요.
"핸드폰이라면 전화가 가능해야 돼. 핸드폰이라면 문자가 가능해야 돼"
이런 식으로 뭐가 가능해야 되는지만 써놓고
이걸 진짜로 어떻게 구현할지는 아이폰이 알아서 하거나 애플이 삼성이 알아서 하거나...
이걸 구현하는 입장에서 알아서 해라 이런 거죠.
그리고 알아서 하는 걸 구체적인 사항은 이제 ServiceImpl에다가 집어넣어주는 거죠.
그래서 여기서는 본문이 없어요.
이렇게 굳이 만드는 이유는...
아니 여기다 그냥 처음부터 만들면 되는데 이거 왜 만들까 생각할 수가 있는데
이거는 자바 문법이랑 관련이 있어요.
자세한 건 다음 시간에.
728x90
'Java, SpringBoot 추가 공부' 카테고리의 다른 글
230317 자바 추가 - 문자열 더하기, break, continue (0) | 2023.03.21 |
---|---|
230317 수업 조건문, 반복문 (2) (0) | 2023.03.20 |
230317 수업 조건문, 반복문 (1) (0) | 2023.03.20 |
20230127 자바 공부 (1) | 2023.02.03 |
2023.01.20 금요일 Java 공부 (0) | 2023.01.27 |
Comments