일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 객체
- java
- mysql
- list
- 빈
- 의존성주입
- Spring legacy Project
- 영속성 컨텍스트
- springboot
- 트랜잭션
- 자동주입
- 이클립스
- 스프링 컨테이너
- 자바
- @Bean
- spring
- merge
- 깃허브
- 인터페이스
- 리액트
- 어노테이션
- pom.xml
- github
- Spring 개발환경 설정
- JVM
- react
- DI
- 스프링
- @transactional
- 상속
- Today
- Total
DEVLOG
[JPA] SELECT 본문
JpaRepository 인터페이스
아래 예제에서 자동 주입될 UserRepository.java는 JpaRepository 인터페이스를 상속한다. 이 JpaRepository 는 기본적인 CRUD 를 처리할 수 있는 getOne, findById, findAll, save, delete 등의 함수가 정의 되어있다. 이들 중 findById를 통해 간단한 데이터를 조회할 수 있다. (SELECT)
findById()
findByid()메서드는 조회하려는 값이 존재할 수도, 존재하지 않을 수도 있어서 null에 의한 오류를 최소화 하기 위해 리턴으로 Optional<T>를 받는다.
그리고 웹브라우저가 요청하면 웹브라우저가 이해할 수 있는 데이터(JSON (GSon 라이브러리 활용하여 변환))로 변환해서 전달해야 한다. 이 때 스프링부트는 MessageConveter가 응답시에 자동으로 작동한다.
만약 아래 예제처럼 자바 Object(return user)를 리턴하게 되면 MessageConveter가 Jackson 라이브러리를 호출해서 Object를 JSON 으로 변환해서 브라우저에게 던져준다.
예제 DummyControllerTest.java
@RestController
public class DummyControllerTest {
@Autowired
private UserRepository userRepository;
// {id} 주소로 파라미터를 전달 받을 수 있음
// http://localhost:8000/blog/dummy/user/3
@GetMapping("/dummy/user/{id}")
public User detail(@PathVariable int id){ // id = {id} 동일해야 함
/* 1. 람다식 사용 */
User user = userRepository.findById(id).orElseThrow(()->{
return new IllegalArgumentException("해당 사용자가 존재하지 않습니다.");
});
/*
2. Supplier 인터페이스 사용
Optional 리턴하는 이유 : 없는 데이터를 findById로 찾을 때 null 리턴될 수 있으므로, Optional로 User 객체를 감싸서 가져올테니 null인지 아닌지 판단해서 return하기 위해
User user = userRepository.findById(id).orElseThrow(new Supplier<IllegalArgumentException>() { // Supplier : 인터페이스
@Override
public IllegalArgumentException get() {
return new IllegalArgumentException("해당 유저는 존재하지 않습니다. id : " + id); // 존재하지 않을 경우
}
});
*/
return user; // 존재할 경우
}
}
1. 존재하는 id SELECT하는 경우
2. 존재하지 않는 id SELECT하는 경우
사용자에게 이러한 에러메세지를 보여주는 것은 지양해야 한다. 그러므로 아래처럼 에러 발생 시 보일 페이지를 따로 만들어야 한다.
GlobalExceptionHandler.java
@ControllerAdvice // 모든 exception 발생 시 해당 클래스로 이동됨
@RestController
public class GlobalExceptionHandler {
@ExceptionHandler(value = IllegalArgumentException.class) // IllegalArgumentException 발생 시에만 아래 함수 호출됨
public String handleArgumentException(IllegalArgumentException e) {
return "<h1>" + e.getMessage() + "</h1>";
}
}
(참고) @PathVariable 어노테이션
@PathVariable 어노테이션을 사용하여 URL경로에 변수를 넣어줄 수 있다. 사용방법은 {템플릿변수}와 동일한 이름을 갖는 파라미터를 추가하면 된다.
https://kkangdda.tistory.com/36
RESTful(1) - @PathVariable 사용하기
@PathVariable → URL경로에 변수 넣어주기 = RESTful 서비스의 URL형태 사용방법: @RequestMapping의 URL 정의 & Method내의 파라미터 부분의 정의 → @RequestMapping 어노테이션 값으로 {템플릿변수} 를 사용..
kkangdda.tistory.com
'Spring Boot > JPA' 카테고리의 다른 글
[JPA] not null constraint violation 에러 (0) | 2022.11.16 |
---|---|
[JPA] open-in-view (0) | 2022.06.30 |
[JPA] 페이징 (0) | 2022.06.27 |
[JPA] UPDATE (0) | 2022.06.27 |
[JPA] 연관관계 매핑 (0) | 2022.06.25 |