[Spring Boot] 데이터베이스 Select 하는 법과 에러체크

[Spring Boot] 데이터베이스 Select 하는 법과 에러체크

데이터베이스의 데이터를 Select할 때 잘못 된 인수가 들어가면 어떻게 해야할까


데이터베이스 Select하기

User table을 select하기에 앞서,

UserRepository라는 인터페이스 파일을 새로 만들고, 그 UserRepository는 JpaRepository를 상속하고 있다.

1
2
3
// 자동으로 bean등록이 된다. --> @Repository 생략가능
public interface UserRepository extends JpaRepository<User, Integer> {
}

그리고 select 기능을 넣어줄 클래스파일에 DI를 해주고,

User의 객체를 return 받을 수 있게, 메소드를 받들어주고, 주소를 넣어준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
public class DummyControllerTest {

@Autowired // 의존성주입(DI)
private UserRepository userRepository;

// {id} 주소로 파라미터를 전달 받을 수 있음.
// http://localhost:8000/blog/dummy/user/3
@GetMapping("/dummy/user/{id}")
public User detail(@PathVariable int id) {
User user = userRepository.findById(id)
...
return user;
}

이 때, 만약 id부분에 DB에 없는 값이 들어가면 어떻게 해야할까… 라는 생각이 들 수 있다.

이 경우, user가 null이 되고, 결국 null값을 반환해주므로 프로그램에 문제가 생길 수 있다.

그래서 findById() 는 Optional로 User객체를 감싸서 반환해준다. 이후 우리가 null인지 아닌지 판단해서 사용하면 된다.

findById().orElseGet()

id값이 유효하면 그대로 user를 반환해주면 되지만, 유효하지 않을 경우 orElseGet을 타서 user에 User()빈 객체를 넣어줄 것이다. 이건 그냥 null과 다르다

orElseGet()에 넣을 수 있는 파라미터는 Supplier의 타입(인터페이스)이고, 이 타입의 Generic부분에 ?가 되어있는데 익명 객체를 넣어준다. 그리고 함수 get을 Override 해준다.

(인터페이스는 new할 수 없기 때문에, 익명 클래스를 만들어줘야한다. )

1
2
3
4
5
6
7
User user = userRepository.findById(id).orElseGet(new Supplier<User>() {
// 데이터베이스에 값이 없는 경우 orElseGet을 타서 user에서 User()...빈 객체를 넣어줌,null이 아님
@Override
public User get() {
return new User();
}
});

findById().orElseThrow()

하지만 findByID()에서 만약 id가 null일 경우 IllegalArgumentException 를 throw하라고 적혀있다.

1
2
3
4
5
6
User user = userRepository.findById(id).orElseThrow(new Supplier<IllegalArgumentException>() {
@Override
public IllegalArgumentException get() {
return new IllegalArgumentException("해당 유저는 없습니다. id: " + id);
}
});

or 람다식을 이용해서…

1
2
3
User user = userRepository.findById(id).orElseThrow(()->{
return new IllegalArgumentException("해당 유저는 없습니다. id: " + id);
});

결과

Spring에는 AOP라는 기능이 있다.

만약 Illegal이 있을경우, 에러를 가로채서 에러페이지로 넘어갈 수 있게 만들 수 있을 것이다.

추가

요청: 웹브라우저

user 객체: 자바 오브젝트

@RestController: html파일이 아닌 data를 리턴해주는 controller

이 경우 웹브라우저가 이해할 수 있는 데이터 (Json)으로 변환해줘야하는데, SpringBoot는 MessageConter가 자바 오브젝트가 리턴될 시 자동으로 Jackson라이브러리를 호출해서 user 오브젝트를 Json으로 변환해서 브라우저에게 전달한다.


[Spring Boot] 데이터베이스 Select 하는 법과 에러체크

https://devch.co.kr/2021/07/18/SPRINGBOOT-DB-Select-21-07-18/

Author

Chaehyeon Lee

Posted on

2021-07-18

Updated on

2021-07-22

Licensed under

댓글