SpringBoot 블로그 만들기- 테이블 생성하기2

정원·2022년 12월 19일
0

SpringBoot

목록 보기
11/34

22.12.19 더미 데이터 select/update/delete

4. 더미 데이터 select 및 응답

데이터 1건 리턴받기

✨ @PathVariable

REST API호출 경험이 있다면,
URI값에 가변형 변수를 전달해서 처리하는 방식을 본적이 있을것이다.

http://127.0.0.1/users?userId={$userId}

http://127.0.0.1/users/{userId}

위에는 일반적인 GET 방식의 파라미터 전달이라 흔히 볼수있었다.
아래는 케이스는 Rest Api호출시 주로 많이 사용하게 된다.

URI를 이용해 파라미터 처리를 할수있다는 뜻이다.

  • @PathVariable 사용 방법
    1. @GetMapping path의 {변수} 괄호안에 괄호 그레이스를 열어 URI에 사용될 변수 명을 입력한다.
      GetMapping 뿐만 아니라 당연히 다른 Method도 가능하다. ( PostMapping, DeleteMapping, PutMapping......)
    2. @PathVariable 어노테이션을 이용해서 {템플릿 변수}동일한 이름을 갖는 파라미터를 추가하면 된다.

❓ User user = userRepository.findById(id); 에러
userRepository의 리턴값은 Optional이다.
userRepository가 Optional로 리턴하는 이유.
만약 user/4을 찾으면 내가 데이터베이스에서 못찾아오게 되면 user가 null이 될 것 아냐?
그럼 return 할때 null이 리턴되면 프로그램에 문제가 생기니까
Optional로 너의 User객체를 감싸서 가져올테니 null인지 아닌지 판단해서 return해라.
✨ Optional 메서드

  1. .get( )
    null이 리턴될 일이 없으니까 그냥 가져와라.
	@GetMapping("/dummy/user/{id}")
	public User detail(@PathVariable int id) {
    
	User user = userRepository.findById(id).get();
    
    return user;
	}

브라우저에 http://localhost:8000/blog/dummy/user/3 요청보내보면
DB에 있는 id이면 잘 가져오지만 없는 데이터를 보내면 500에러 발생.

  1. .orElseGet(null)
    null 이면 객체하나 만들어서 넣어줘라.
    .orElseGet(파라미터 타입 : Supplier<? extends User> other)

값이 null이 아니면 user가 리턴
값이 null이면 빈 user 객체가 리턴된다.

User user = userRepository.findById(id).orElseGet(new Supplier<User>() { //익명객체 생성
			//Supplier는 인터페이스이기 때문에 new 하면서 바로 Override 진행
			@Override
			public User get() {
				return new User();
			}
		});

orElseGet 을 DB에 없는 id를 요청했을때 에러는 나지않고
새로운 객체를 생성해주기 때문에 null이 보여진다.

  1. .orElseThrow()

findById의 선언부로 가보면
값이 null일때 IllegalArgumentException으로 처리하는 것을 권하고 있다.

✨ IllegalArgumentException
적합하지 않거나(illegal) 적절하지 못한(inappropriate) 인자를
메소드에 넘겨주었을 때 발생하는 예외.

User user = userRepository.findById(id).orElseThrow(new Supplier<IllegalArgumentException>() {
	@Override
	public IllegalArgumentException get() {
		return new IllegalArgumentException("해당 유저는 없습니다. id : " + id); //메세지를 담을 수 있다.
	}
});

orElseThrow 를 DB에 없는 id를 요청하면
500에러와 함께 메세지를 확인할 수 있다.

//람다식
//자바 1.8버전 이후
//orElseThrow()를 사용할때 그에 맞는 리턴타입등을 찾기가 불편할때 람다식을 사용하면 편하다.
User user = userRepository.findById(id).orElseThrow(() -> {
	return new IllegalArgumentException("해당 유저는 없습니다. id : " + id);
});

✨ 현재 요청은 웹브라우저에서 보내고
리턴값을 user 객체(자바 오브젝트)이다.
하지만 웹브라우저는 html만 이해를 하기때문에
변환을 해야한다. -> json을 이용

스프링부트는 MessageConverter 라는 애가 응답시에 자동 작동이 된다.
만약에 자바 오브젝트를 리턴하게 되면 MessageConverter가 Jackson 라이브러리를 호출해서
user 오브젝트를 json으로 변환해서 브라우저에게 던져주기때문에
웹브라우저에서 객체를 리턴 받았을때 json 형태로 보여지게 되는 것이다.

Response - Content Type = json

데이터 2건 리턴받기

@GetMapping("/dummy/user")
public List<User> list(){
	return userRepository.findAll();
}

브라우저에 http://localhost:8000/blog/dummy/user 요청하면
json으로 리턴된다.

한페이지당 2건에 데이터를 리턴받아 볼 예정

@PageableDefault 사용

@GetMapping("/dummy/user/page")
public Page<User> pageList(@PageableDefault(size=2, sort="id", direction = Sort.Direction.DESC) Pageable pageable){
	Page<User> users =  userRepository.findAll(pageable);
	return users;
}


한 페이지에 두건만 가지고 온다.
다음 페이지로 이동할 경우에는 요청 url에 ?page=0 , ?page=1 ... 을 붙이면 된다.
http://localhost:8000/blog/dummy/user/page?page=1

@PageableDefault(size=2, sort="id", direction = Sort.Direction.DESC) Pageable pageable

한페이지에 2개 , 정렬은 id기준 , 최신id 순으로 페이징.

✨ content 밑에 부수적인 것들 없애기
.getContent() 이용
.getContent() 는 List를 리턴하기 때문에 Page -> List로 변경하면
객체만 가지고 온다.

@GetMapping("/dummy/user/page")
public List<User> pageList(@PageableDefault(size=2, sort="id", direction = Sort.Direction.DESC) Pageable pageable){
	List<User> users =  userRepository.findAll(pageable).getContent();
	return users;
}


아래처럼도 작성가능.

@GetMapping("/dummy/user/page")
public List<User> pageList(@PageableDefault(size=2, sort="id", direction = Sort.Direction.DESC) Pageable pageable){
	Page<User> pagingUser =  userRepository.findAll(pageable);
	
	List<User> users = pagingUser.getContent();
	return users;
}

5. 더미 데이터 update

https://ict-nroo.tistory.com/130

[JPA] 영속성 컨텍스트와 플러시 이해하기

영속성 컨텍스트 JPA를 공부할 때 가장 중요한게 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping) 과 영속성 컨텍스트를 이해하는 것 이다. 두가지 개념은 꼭 알고 JPA를 활용하자.

ict-nroo.tistory.com

6. 더미 데이터 delete

7. 무한 참조 방지하기

(1) Entity로 받고 Json직렬화 하기 전에 DTO 생성후 복사하기

BeanUtils.copyProperties(A,B)

(2) 처음부터 DTO로 DB에서 받기

(3) @JsonIgnore

(4) @JsonIgnoreProperties({"board"})

(5) @JsonBackReference @JsonManagedReference

참고

https://dublin-java.tistory.com/32

0개의 댓글