Digking's cave

My First Blog Project (7) : 전체 user Select / ID로 Select / 페이징 본문

Spring/My First Blog Project

My First Blog Project (7) : 전체 user Select / ID로 Select / 페이징

디깅 2022. 12. 16. 17:04
728x90

DummyControllerTest.java

package com.cos.blog.test;

import com.cos.blog.model.RoleType;
import com.cos.blog.model.User;
import com.cos.blog.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.web.bind.annotation.*;

import javax.transaction.Transactional;
import java.util.List;
import java.util.function.Supplier;

@RestController
public class DummyControllerTest {
    @Autowired
    private UserRepository userRepository;

	// 회원 가입
    @PostMapping("/dummy/join")
    public String join(User user){
        user.setRoles(RoleType.USER);
        userRepository.save(user);
        return "회원가입 완료";
    }
	
    // 회원 모두 조회
	@GetMapping("/dummy/users")
    public List<User> list(){
        return userRepository.findAll();
    }
    
    @GetMapping("/dummy/user/{id}")
    public User detail(@PathVariable int id){
        //IllegalArgumentException 을 return
        User user = userRepository.findById(id).orElseThrow(new Supplier<IllegalArgumentException>() {
            @Override
            public IllegalArgumentException get() {
                return new IllegalArgumentException("id "+id+" : 해당 유저는 없습니다.");
            }
        });
        
        return user;
    }


    // 한 페이지 당 2건의 데이터를 리턴 (페이징)
    @GetMapping("/dummy/user")
    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;
    }

}


-

findById의 return타입은 optional이다.
만약 찾는 값이 null이면 optional로 user객체 감싸온 후에 null인지 판단 후 return

 

👇Supplier 사용하여 id로 찾는 방법👇

// {id}주소로 파라미터를 전달받을 수 있음
@GetMapping("/dummy/user/{id}")
public User detail(@PathVariable int id){
    User user = userRepository.findById(id).orElseGet(new Supplier<User>() {
        @Override
        public User get() {
        	return new User();
        }
     });
}

Supplier가 인터페이스라 overriding 해준다.

 

new User();

- 만약 값이 없다면 빈 객체를 user에 넣어서 만들어준다.

 

👇IllegalArgumentException 을 활용하는 방법👇

    @GetMapping("/dummy/user/{id}")
    public User detail(@PathVariable int id){
        //IllegalArgumentException 을 return
        User user = userRepository.findById(id).orElseThrow(new Supplier<IllegalArgumentException>() {
            @Override
            public IllegalArgumentException get() {
                return new IllegalArgumentException("id "+id+" : 해당 유저는 없습니다.");
            }
        });
        return user;
    }

- IllegalArgumentException 로 에러생겼을 경우 에러 페이지 나오도록함

 

-

웹브라우저가 요청 -> user 객체로 리턴해줌
user 객체 = 자바 오브젝트 라서 json으로 변경해서 던져야 웹브라우저가 이해함
springboot 는 MessageConverter라는 애가 응답시에 자동 작동해서,
만약에 자바 오브젝트를 리턴하게 되면 MessageConverter가 Jackson 라이브러리를 호출해서 user 오브젝트를 json으로 변환해서 브라우저에게 던져준다.

 

# 페이징

    @GetMapping("/dummy/user")
    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;
    }

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

- 기본 페이징 전략이 2건씩 들고와서 id로 정렬하는데 id를 최신순으로 해서 페이징한다.

 

pagingUser.isFirst() : 첫 번째 페이지인지 확인

pagingUser.isLast() : 마지막 페이지인지 확인

반응형