JSON은 왜 나왔고, 어떻게 사용하는가?
프랑스인, 일본인, 독일인이 한국인과 데이터를 교류한다면 한국인이 프랑스어, 일본어, 독일어를 배우는 것보다는 프랑스인과 일본인과 독일인이 한국어를 공부하는게 더 효율적이다.
하지만 한국인이 미국인으로 바뀌게 된다면? 통신이 중지된다.
따라서 모두가 사용할 수 있는 공용어를 정하고 그것을 모두가 공부하고 그것으로 통신을 하면 문제가 해결된다.
모든 사람들은 데이터를 전송 시에 자기나라 언어를 공용어(예: 영어)로 번역하고, 마찬가지로 모든 사람들은 데이터를 응답받을 때 영어를 자기나라 언어로 번역하는 것이 이상적인 프로토콜이 된다.
서로 다른 오브젝트는 이해할 수 없다. 자바데이터를 보내면 파이썬은 이해할 수 없다.
따라서 공용어를 만들게 되는데 이것을 Json이라고 한다.
자바가 파이썬에게 데이터를 보내고 싶다면 자바를 Json으로 변경해서 데이터를 보내게 되고,
파이썬은 Json을 받아 자신이 쓰는 파이썬으로 바꾼다.
Json은 중간 데이터이다.
자신의 언어를 Json으로 바꾸는 것은 데이터 전송시에, Json을 자신의 언어로 바꾸는 것은 응답시에 일어난다. 앞으로 통신을 할 때 자바 오브젝트를 Json 데이터로 바꾼다는 의미는 전송한다는 것, Json 데이터를 자바 오브젝트로 받는 것은 응답한다는 것이다.
@Controller에서 외부에서 요청이 오면 실행하는 requestBody데이터를 전부 Json으로 받을 것임, req도 res도 json을 사용하기
더미데이터 INSERT
insert의 경우 데이터를 추가하는 것이기 때문에 post 요청을 사용한다.
@RestController
public class DummyControllerTest {
//http://localhost8000/blog/dummy/join (요청)
//http의 body에 username, password, email 데이터를 가지고 (요청)
@PostMapping("/dummy/join") //회원가입 = insert
public String join(String username, String password, String email) { //key=value (약속된 규칙)
System.out.println("username: "+username);
System.out.println("password: "+password);
System.out.println("email: "+email);
return "회원가입이 완료되었습니다.";
}
}
html에서 폼태그를 만들어서 데이터를 전송하면 x-www-form-... mime 타입으로 데이터를 전송하는데,
key와 value로 데이터를 전송한다는 것이다. "key=value&key=value" 형태
콘솔창에 전송된 것을 확인할 수 있다.
public String join(User user) { //key=value (약속된 규칙)
System.out.println("username: "+user.getUsername());
System.out.println("password: "+user.getPassword());
System.out.println("email: "+user.getEmail());
파라미터를 받을 때 이렇게 오브젝트(User)로 받을 수도 있다.
데이터베이스에 insert하기 위해서는 repository 패키지를 하나 만들고, 인터페이스 클래스를 만들고 JpaRepository를 상속받는다.
JpaRepository는 여러가지 함수를 가지고 있는데, findAll()이라는 함수는 테이블이 들고 있는 모든 행을 리턴한다.
findById()와 같이 id를 찾아내는 함수나 count() 같이 유저 행이 몇개인지 알려주는 함수들도 포함한다.
//DAO
//자동으로 bean등록이 된다
//@Repository 생략 가능하다
public interface UserRepository extends JpaRepository<User, Integer>{
//유저 테이블을 관리하는 JpaRepository이며 유저테이블의 PRIMARYKEY는 int이다.
}
@Autowired //의존성 주입(DI)
private UserRepository userRepository;
userRepository.save(user);
role의 경우 default value가 user니까 null값이 들어가게 되는데, @DynamicInsert 어노테이션을 붙이면 insert시에 null인 필드를 제외시켜준다.
RoleType Enum을 만들어서 USER, ADMIN를 넣어서 사용한다.
enum을 만들면 내가 넣는 값을 강제할 수 있어 실수를 방지할 수 있다.
@Enumerated(EnumType.STRING)
private RoleType role; //Enum을 쓰는게 좋다 //admin, user, manager
User 전체를 리턴하기
//http://localhost:8000/blog/dummy/user
@GetMapping("/dummy/user")
public List<User> list() {
return userRepository.findAll(); //전체가 리턴됨
}
RestController
html 파일이 아닌 데이터를 리턴해주는 컨트롤러가 RestController이다.
요청은 웹 브라우저에서 생겨나는데 user 객체는 자바 오브젝트이다. RestController는 Data만 이해할 수 있기 때문에 변환해줘야 한다.
변환(웹 브라우저가 이해할 수 있는 데이터) -> Json
스프링부트 = MessageConverter가 응답시에 자동으로 작동하여 변환
만약에 자바 오브젝트를 리턴하게 되면 MessageConverter가 Jackson 라이브러리를 호출해서 user 오브젝트를 json으로 변환해서 브라우저에게 던져준다 → request하면 contenttype은 json이 된다
페이징
//한 페이지 당 2건의 데이터 리턴 받기
@GetMapping("/dummy/user/page")
public Page<User> pageList(@PageableDefault(size=2, sort="id", direction=Sort.Direction.DESC) Pageable pageable) {
//두건씩 받고, id로 정렬하고, id는 최신순으로 받는다
Page<User> users = userRepository.findAll(pageable);
return users;
}
페이징하기
http://localhost:8000/blog/dummy/user?page=0
http://localhost:8000/blog/dummy/user?page=1
http://localhost:8000/blog/dummy/user?page=2
더미데이터 UPDATE
update는 PutMapping 요청을 사용한다
@PathVariable로 파라미터를 받을수 있다
json 데이터를 받기 위해서는 @RequestBody를 사용한다
//email, password를 받는다
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id, @RequestBody User requestUser) {
//@RequestBody: json 데이터 요청 -> java 오브젝트로 받아줌(MessageConverter)
System.out.println("id: "+id);
System.out.println("password: "+requestUser.getPassword());
System.out.println("email: "+requestUser.getEmail());
return null;
}
null값을 제거하기 위해 변경한 코드 (save 함수를 사용하기)
save() 함수는 id를 전달하지 않으면 insert를 해주고, id를 전달하면 해당 id에 대한 데이터가 있으면 update를 해주고 해당 id에 대한 데이터가 없으면 insert를 한다.
//email, password를 받는다
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id, @RequestBody User requestUser) {
//@RequestBody: json 데이터 요청 -> java 오브젝트로 받아줌(MessageConverter)
System.out.println("id: "+id);
System.out.println("password: "+requestUser.getPassword());
System.out.println("email: "+requestUser.getEmail());
User user = userRepository.findById(id).orElseThrow(()->{
return new IllegalArgumentException("수정에 실패하였습니다.");
});
user.setPassword(requestUser.getPassword());
user.setEmail(requestUser.getEmail());
userRepository.save(user);
return null;
}
*save() 호출하지 않고 데이터를 업데이트 하려면? > @Transactional (더티체킹)
본 강의는 '메타코딩'님의 동영상 강의를 참고하였습니다.
출처 : https://www.youtube.com/playlist?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm
'JAVA > Spring' 카테고리의 다른 글
영속성 컨텍스트, json 통신 (0) | 2022.02.18 |
---|---|
JPA 테이블 생성하기, 연관 관계 (0) | 2022.02.17 |
yml 파일 설정, jsp 파일 (0) | 2022.02.17 |
Maven과 라이브러리/Builder 패턴/yaml 설정 (0) | 2022.02.17 |
포스트맨 실습 : 데이터 요청하기 (0) | 2022.02.17 |