묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 수량이 재고를 넘어섰을 때
주문 수량이 재고를 넘어섰을 때,현재는 Error가 발생해서 whitelabel ErrorPage가 뜨는데요, 이 대신 MemberForm처럼 BindingResult를 걸어 hasError() -> 폼에 message를 표시해주는 것과 같은 기능을 넣고 싶은데, 혹시 어떻게 할 수 있을 지 힌트를 주실 수 있으실까요..?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
기본값 타입에 대해서 강사님이 사용하시는 방법이 궁금 합니다.
안녕하세요 강사님 스프링 부트 JPA 활용 부분에 설계부분을 보고 있는대요 Entity 맵핑에 사용하는 기본 값 타입이 갑자기 궁금해서 질문을 드리게 되었습니다. (여기에 질문을 남기는게 적절하다고 생각이 되었습니다^^) Entity Class를 생성하면 결국 DB에 테이블과 매칭이 되는데 이때 아래 2가지 타입 중에서 강사님이 사용하시는 방법이 궁금합니다. primitive 타입 @Column private long count; Wrapper 타입 @Column private Long count; 이 경우 신규로 테이블을 생성할 경우와 운영 중 테이블에 컬럼을 추가할 경우가 발생할 것 같은데요 강사님이 실무에 자주 사용하는 방법이 궁금하네요^^; 테이블에 not null 제약 조건이 걸리면 long을 사용해도 될 것 같은데 null 제약 조건이 없다면 long을 사용 시 문제가 발생할 것 같아서요 데이터가 어떤 값을 가져야 하는지 먼저 생각하는 게 가장 중요하다고 생각 되긴 하는데 강사님이 활용하시는 방법이 궁금해서 질문 드립니다. (어떻게 보면 너무 당연한 질문 같아서;; 괜히 질문 드렸나 하는 마음도 있네요;;) 관련해서 구글링을 해보았는데 저랑 비슷하게 생각하시는 글이 있어서 질문 드리게 되었습니다. https://chanwookpark.github.io/jpa/2016/10/13/jpa-note/#%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8-%ED%83%80%EC%9E%85-%EC%82%AC%EC%9A%A9-%EC%8B%9C-primitive-%ED%83%80%EC%9E%85%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0-%EA%B2%83%EC%9D%B8%EA%B0%80-wrapper-%ED%83%80%EC%9E%85%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0-%EA%B2%83%EC%9D%B8%EA%B0%80 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
인텔리J tdd 라이브템플릿 생성하는 방법 입니다.
안녕하세요 강사님 강의를 보다가 tdd라는 명령어로 테스트 메서드를 생성하는 방법이 궁금해서 관련 가이드를 만들어 보았습니다. https://blog.naver.com/nateen7248/222184184776 혹시 궁금하신 분은 참고해 보시면 될 것 같아요 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
동일한 레코드의 참조 값을 가지고 있는 영속성 컨텍스트의 동일 객체를, 동시에 서로 다른 값으로 업데이트하여 커밋할 때의 작동 방식
안녕하세요. 추천해주신 야생형 스타일에 따라 활용 1편부터 듣고 있는 수강 중인 학생입니다. 매번 강의 너무 잘 듣고 있습니다. 제가 스프링에 대한 이해도가 아직 낮기도 하고, 다른 강의를 이어서 듣다보면 해결될 문제일진 모르겠지만, 이해가 잘 안되는 부분이 자꾸 생각나서 질문 남깁니다. @GetMapping("/test1") @ResponseBody public String test1() { log.info("test1 controller"); try { Thread.sleep(5000); } catch(Exception e) { } log.info("test1 controller finished"); return "test1 finished"; } @GetMapping("/test2") @ResponseBody public String test2() { log.info("test2 controller"); try { Thread.sleep(5000); } catch(Exception e) { } log.info("test2 controller finished"); return "test2 finished"; } 위와 같은 컨트롤러 메서드 코드가 있다고 가정할 때, 각 컨트롤러 메서드가 다른 메서드라면, 각각의 메서드 별로 스레드를 가진 채 실행한다고 이해가 되었습니다. 즉, test1이 실행하는 도중에 test2가 실행될 수는 있지만, test1이 실행하는 도중에 test1은 중복해서 실행될 수 없는 것처럼 보였습니다. 일단 스프링의 작동 방식은 이처럼 이해되었습니다. 그런데 만약 아래와 같이 test1과 test2에서, 동일한 Item객체를 JPA에서 동시에 꺼내온 상황에 업데이트가 일어나면 어떻게 되는지 궁금합니다. 아래의 실행 과정은 제가 개인적으로 생각해본 과정인데, 어떠한 부분이 잘못되었는지 지적해주시면 감사하겠습니다. 1. test1에서 서비스 로직을 실행하는 도중 JPA를 이용하여 Item 객체를 findOne해서 꺼내온다(동시에 영속성 컨텍스트에 등록이 된다는 것처럼 이해되었습니다.) 2. test1가 아직 실행되고 있는 와중에, test2에서 서비스 로직을 실행하는 도중 JPA를 이용하여 Item객체를 findOne해서 꺼내온다(이 객체 또한 영속성 컨텍스트에 등록이 된다는 것처럼 이해되었습니다.) 3. 현재 test1과 test2에서 각각 동일한 Item 객체를 가져와서 영속성 컨텍스트에 등록이 된 상황이라고 보겠습니다. 앞으로 실행 될 test1의 서비스에서는 count를 10올릴 것이고, test2에서는 count를 10내린다고 가정해보겠습니다. 현재 Item 객체에는 100이라는 값이 저장되어있습니다. 4. test1에서 item.addCount(10)을 하면, count는 110이 될 것입니다. 바로 이어서 test2에서 item.removeCount(10)을 하면, count는 90이 될 것입니다. 5. test1의 서비스 로직이 끝나면, @Transactional 어노테이션을 통해 commit이 일어나고, dirty checking을 하며 item 객체의 count를 110으로 업데이트하는 쿼리문을 날릴 것입니다. 6. test2의 서비스 로직이 끝나면, @Transactional 어노테이션을 통해 commit이 일어나고, dirty checking을 하며 item 객체의 count를 90으로 업데이트하는 쿼리문을 날릴 것입니다. 7. 따라서 최종적으로 item 객체의 count값은 90으로 업데이트 될 것입니다. 하지만 실제로는 test1에서 10을 더하고, test2에서 10을 차감하였으니, 동일한 item 객체에 대한 count값은 DBMS 상에서 100으로 유지되어야 맞을 것입니다. 제가 생각한 실행 과정은 90으로 값이 업데이트되며 DBMS의 값의 일관성을 깨뜨리는 상황입니다(물론 제가 짧은 생각대로 실행한 과정의 결과가 90이란 것이지, 코드의 실행 결과가 90이라고 단언한 것은 아닙니다. 결과도 궁금하지만, 100이라는 결과가 나오는 과정에서 어떻게 실행되는지가 궁금한 것입니다!). 어떠한 부분이 잘못되었고, 그 부분은 어떻게 해결되어지는 것인지 궁금합니다. 개인적으로 생각해본 가정은 다음과 같습니다. 가정1 : 동일한 레코드를 조회한 객체에 대해서는 영속성 컨텍스트에 동일한 객체로 기억되기때문에 test1과 test2에서는 동일한 참조 값을 가진 item 객체를 가지고 있다. 따라서 addCount를 할 때 110으로 바뀌고, removeCount를 할 때 100으로 다시 바뀌기 때문에, test1과 test2의 커밋 각각에서는 count 값을 100으로 바꾸는 동일한 update문이 두 번 일어난다. 가정 2 : 동일한 레코드에 대해서 이미 commit 또는 업데이트 된 내역이 있으면, 지금 일어나는 commit은 그냥 ROLLBACK을 시켜버린다. 하지만 이렇게 할 경우, 자바 코드 상에서 DBMS에 저장된 아이템에 대해 동일한 것을 접근했는지 어떻게 기억할 것이며, rollback으로 인한 오버헤드는 감수하는 것인지 의문점이 남습니다. 가정 3 : 동일한 레코드로 조회된 객체에 대해서는 업데이트가 일어나는 전 과정에, 해당 객체에 lock을 걸어둔다. 그러면, 업데이트가 끝나서 commit이 되고, lock을 해제할 때까지 해당 객체에는 접근하지 못한다. 처음에는 이러한 과정이 @Transactional 어노테이션이 붙어있으면, 이 어노테이션이 달려있는 메서드 중에 1개씩만 실행되면서 수행되는 줄 알았는데 제가 아직 개념이 부족한 탓인지 딱히 그렇게 실행되는 것 같지는 않았습니다. 가정 4 : 애초에 이러한 설계가 잘못된 것이다. test1과 test2에서 동시에 item 객체를 수정하는 과정의 코드는 없어야한다. test1 또는 test2, 둘 중에 하나의 메서드에서만 item 객체를 수정할 수 있어야한다. 가정 5 : 그냥 DBMS에서의 트랜잭션처럼 관리된다. 자바 상에서 동시에 실행되는것처럼 보여도 JPA를 통해 serializable한 실행 결과를 보장해준다. 일단 DBMS에서 트랜잭션 간에 동시성을 관리하는 체계를 생각하면, 위와 같은 가정들이 나온다고 생각했습니다. 하지만 그건 DBMS에서의 동시성 관리 체계이지, JPA 상에서도 @Transactional 어노테이션 하나로 그것처럼 동일하게 관리되는지는 잘 모르겠어서 의문이 남습니다. 질문이 미흡해서 제가 의문점을 제대로 남긴 것인지 모르겠네요. 바쁘신 와중에 시간 내 주셔서 감사합니다. +++ @Test@Transactional@Rollback(false)public void 동시업데이트() { // given Book book = new Book(); book.setName("희재의 책"); book.setIsbn("1234"); book.setStockQuantity(100); book.setPrice(30000); em.persist(book); Book book1 = em.find(Book.class, 1L); Book book2 = em.find(Book.class, 1L); // when book1.addStock(10); book2.removeStock(20); Book book3 = em.find(Book.class, 1L); // then assertThat(book1).isSameAs(book2); assertThat(book2).isSameAs(book3); assertThat(book3.getStockQuantity()).isEqualTo(90);} 일단 위와 같은 테스트 코드로 DBMS 상에서 같은 레코드를 조회한 아이템에 대해서는 동일한 객체를 반환하는 것을 확인했습니다. (같은 트랜잭션 상에서만?) 그런데 처음 적은 예시처럼 영속성 컨텍스트에 등록된 동일한 객체에 대해 동시에 커밋이 여러 개 일어나면 어떻게 되는지, 또 이것을 확인해보고 검증하는 테스트 코드는 어떤 식으로 작성해야하는지 잘 모르겠네요.. ㅠㅠ
-
미해결실전! Querydsl
mysql 로 설정하시는 분들을 위한 팁(질문 관련 없음)
mysql 같은 경우 앞서 applicationTest 적고 ( contextload) build하면 에러가 날 수 있습니다. build 시 contextload 있는 부분 지우고 build 하셔야 에러가 안납니다,
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 양방향 매핑 시 연관관계 편의 메소드 사용 질문 드립니다.
안녕하세요. 강의 잘 듣고 있습니다. 다름이 아니라, 일대일 매핑에서, 연관관계 편의 메소드를 작성할때 Order, Delivery 객체에 이렇게 편의메소드를 작성하는게 맞는 방법일까요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
static create 메소드
setter를 쓰기보다, static create로 메소드를 만들어 주는게 좋다고 하셨는데, 생성자 메소드로 만들지 않고, 왜 일반 정적 메소드로 만드시는지 궁금합니다..
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 강사님 질문있습니다.
첫번째로 제가 api란 용어를 application program interface라고 알고 있는데 맞나요? 두번째는 1번째 강의에서 만든건 API라는게 적용이 안된 프로젝트인가요? API개념이 햇갈려서요;;; 세번째로는 postman을 깔긴 깔았는데요 왜 이걸로 테스트를 하는거에요? 그냥 첫강의때처럼 쌩으로 크롬같은데서 켜서 하는거랑 무슨차이인가요? 네번째는 @RequestBody에 대해서인데요. 이 어노테이션이 파라미터에 붙으면 ajax에서 json 형태로 전송하면 그 전송한걸 받는 곳에 이걸 붙으는걸로 알고 있는데 맞나요? 그래서 postman에서 json형태로 컨트롤러쪽에 post형태로 쏴줬으니 저 어노테이션을 붙인 곳에 바인딩된다고 생각을 하면 되는게 맞지요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Ctrl + Alt + M 단축키가 안되는 분들 보세요!
Geforce Experience가 설치된 분들에 한해서 Ctrl + Alt + M(Extract Method) 단축키가 작동하지 않는 오류를 발견했습니다. Geforce Experience를 켜고 설정에서 빨간색 네모 친 게임 내 오버레이 기능을 OFF하시면 단축키가 잘 작동할 것입니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
src/test/resources/application.yml 인식 문제입니다.
안녕하세요 강사님! 테스트 수행 중 application.yml 파일을 test 밑에 두고 따라하는중에 application.yml 파일을 찾지 못하고 자꾸 main 밑에있는 파일을 불러왔습니다. 찾아보니 test/resources/config/application.yml 로 두어야 인식한다고 되어있고 저도 config 디렉토리를 생성해 그 밑에 두었더니 별도의 application.yml 파일로 읽어오더라구요. https://stackoverflow.com/a/53134737 인텔리제이로 학습중인데 이부분 한번 확인 부탁드리겠습니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
기본 생성자에 관해 질문드립니다.
13:43 부분을 보면 JPA 는 내부적으로 리플렉션을 통해서 객체를 생성하기 때문에 기본 생성자가 필요하다고 하셨는데요. 다음과 같이 기본 생성자는 생성하지 않고 코드를 돌리더라도 문제없이 돌아가던데, 내부적으로 기본생성자가 없더라도 동작하도록 변경이 된걸까요.? 추가) 추가적으로 강의를 진행 하던 중에 em.find() 로 실행하니 이제는 디폴트 메소드가 없다고 에러메시지가 출력이 되네요. persist() 할 때는 출력되지 않던 에러가 find() 에서는 출력되는데 어떤 메커니즘 차이 때문에 이런 결과가 발생하는 건가요.?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 등록시에 데이터 받는 로직
안녕하세요따로 공부하다가 궁금한 점이 생겨서 질문 남깁니다. item에서 InheritanceType.JOINED 를 사용하게 되면 화면에서 컨트롤러로 Form data를 받아와서 처리하는 로직은 어떤식으로 구현을 하는게 효과적인가요? 예를들면 formData에 타입을 넣어줘서 if else문으로 각각에 맞는 Controller(formData){if(formData.getType equals "B") persist( new B(formData.a formData.b , formData.c)) else if ("A") persist( new A(formData.dd formData.gg ) else if ~~~~} 이런식으로 전부 빼야 하나요?? 만약 위와 같은 상황이라면 타입이 엄청나게 많아지는 경우 무한if else을 쓰기는 좀 비효율적인 코드가 될 거 같아서 질문드립니다.
-
해결됨실전! Querydsl
읽기전용 entity 만들기
안녕하세요. 다른 사람이 만든 DB의 데이터를 가져와서 가공하여 제공하는 API를 만들려고 합니다. spring data jpa + querydsl 환경이고 읽기전용 entity를 만들려고 합니다. 기본편도 들었지만 entity를 만들면서 db도 생성되었기에 읽기전용 entity를 어떻게 만드는지 혹여나 컬럼 혹은 데이터 수정이 되지 않을지, entity를 만들때 모든 컬럼을 다 정의해야되는지 등의 개념을 파악하기가 힘듭니다. 검색해봐도 잘 나오지 않네요. 혹시 답변 가능하실까요? 참고할만한 사이트 혹은 개념이라도 알려주시면 찾아서 해보겠습니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
dto에서의 join질문이있습니다.
좋은강의감사합니다. 질문이있습니다. 엔티티조회방식에선 fetch join을 했는데, 여기에선 왜 일반 join을 하는 것인가요??
-
미해결실전! Querydsl
연관관계 메소드 질문
안녕하세요 강사님. 기본강의에서도 연관관계 메소드를 공부하여 알고 있었습니다. 양방향 연관관계에서 주인이 되는 쪽을 수정하면 주인이 아닌쪽에서도 자동으로 수정이 되지만 객체의 개념으로 접근하기 위해 양쪽을 모두 수정해주는 연관관계 메소드가 필요한것인가요? 주인이 되는 쪽만 잘 수정해주면 사실상 연관관계 메소드가 필요 없는 것이지요? 그렇다면 changeTeam 연관관계 메소드를 이용해서 팀을 바꾸었을때 바뀐 팀의 멤버를 추가하는 것이 맞다면 반대로 바뀌기 전의 팀에서도 멤버를 제거해야되는것이 아닌가요? 예를 들어서 팀1 -> 멤버1 팀2 -> 멤버2 에서 멤버1을 팀2로 옮길시 연관관계 메소드는 add만 해주시기때문에 팀1 -> 멤버1 팀2 -> 멤버2, 멤버1 로 되어 제거를 해주어야 한다고 생각합니다. 하지만 테스트 결과 주인이 되는 쪽을 수정하니 자동으로 멤버1이 제거가 되더군요. 이 또한 객체의 개념을 살리기 위해 제거가 자동으로 되지만 제거가 되는 remove()를 추가해줘야 할까요?
-
미해결실전! 스프링 데이터 JPA
리포지토리 분리
리포지토리를 분리하신다고 하셨는데1. 정말 간단한 쿼리는 스프링 데이터 JPA 리포지토리에서 구현, 쿼리메서드 기능들을 이용하고조금 복잡하고, 강의에서 설명해주신 다양한 이유에 해당하면 사용자 정의 리포지토리를 구현해서 사용하고더 복잡한 동적쿼리들은 따로 클래스를 만들어서총 3개의 리포지토리를 운영하게 되는건가요?2. 서비스와 리포지토리는 1:1로 매핑하는게 좋다고 들었는데 그럼 3개의 서비스클래스도 따로 만드나요?3. 핵심 비즈니스 로직과 단순 화면 관련 로직도 구분은 서비스계층에서 이루어지나요? 그럼 하나의 서비스에서 두개의 리포지토리를 접근해도 괜찮나요??아직 아키텍처를 고민할만한 실력은 아니지만궁금점이 해결되지 않아 질문남깁니다..
-
해결됨스프링 데이터 JPA
비동기 쿼리
안녕하세요 기선님 항상 좋은 강의 감사드립니다! 매 영상마다 질문을 남기는 것 같아 죄송하네요.. 비동기 쿼리에 대한 내용을 제 나름대로 요약해서 해석해보려 노력중인데 곡해가 있을까 걱정이 되어 이렇게 글을 남깁니다. 비동기 쿼리를 사용하는 것을 보니, 쿼리를 날리고 데이터를 받아오기 전까지 메인 쓰레드를 놀리지 않기 위해 비동기 쿼리를 사용하는 것으로 보입니다. 그런데 Future 을 사용하면 결국 get 으로 받아오는 작업에서 메인쓰레드가 블로킹이 되니까 Future 보단 콜백메서드를 사용할 수 있는 ListenableFuture 을 사용하는 걸 추천하신거라고 이해 됩니다. 그렇다면 여기서 조금 쓸모없는(?) 작업이긴 하지만 Future 의 get 을 받는 Thread 를 직접 구현해도 되겠다는 생각도 듭니다. 그리고 비동기 쿼리에 대한 테스트 코드 작성이 어려운 이유는 테스트의 특성상 위 테스트는 작업 전체가 한 트랜잭션이 될 테고, save 된 데이터를 가져오기 위한 쓰레드가 작업을 마치기도 전에 메인쓰레드가 끝나버리면서 하이버네이츠의 DB에 변화를 가져오지 않는 쿼리는 날리지도 않는 특성에 의해 insert 쿼리 조차 날라가지 않는 테스트가 되는 거구요. 의도적으로 flush() 를 통해 insert 를 할 수 는 있으나, insert 와 같은 트랜잭션 안에서 시작된 select 쿼리는 그 트랜잭션 내에서 insert가 된 데이터를 인지할 방법은 없게 된다는 설명으로 이해했습니다. 그렇다면.. 테스트를 위해서 @BeforeEach 를 통해 데이터를 먼저 집어넣은 상태로 동작을 확인할 수 있진 않을까 했지만, 이 작업자체도 DB의 변화를 일으키는 작업이 아닌만큼 하이버네이츠가 insert 를 날리지조차 않더군요. 그래서 위 코드에서 flush()를 추가하여 insert를 날렸지만.. 결과는 이렇더군요... 그런데 제 나름대로의 해석으로는 마지막 결과가 조금 이해가 되지 않네요.. 데이터를 집어넣었고 select 를 하는게 보이는데, size 는 0 이뜨고 근데 또 테스트는 성공하네요.. @BeforeEach도 결국은 한 트랜잭션안에서 동작하여 기존의 테스트 코드처럼 내부에서 Comment를 insert 하는 것과 동일한 작업인것인지.. 근데 또 테스트는 어떻게 성공한건지... 어디가 잘못된걸까요? 또 만약,, 제가 이상하게 이해한 부분이 있는 것 같다면 알려주시면 너무 감사하겠습니다!!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 편의 메서드 위치에 관련한 질문입니다.
다대일 관계에서 다쪽에 편의 메서드가 존재하는 경우 아래처럼 setter없이 =연산자와 add메서드를 통해 설정이 가능합니다. public class Member{ private Team team; public void setTeam(Team team) { this.team = team; team.getMembers().add(this); } // ... } 그런데 일쪽에 편의 메서드가 사용되면 public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this);} 이런식으로 setter를 사용할 수밖에 없습니다. (물론 위에 set팀도 setter메서드를 정의한 것이긴 하지만) 제가 이런 질문을 하는 이유는 영한님께서 강의마다 하시는 말씀중에 setter은 가능하면 열어두지 말고 따로 비즈니스 로직을 위한 메서드를 정의해서 사용하는 것이 좋다고 하셨기 때문입니다. 하지만 연관관계 편의 메서드를 위해서는 setter가 필수불가결해보이는데, 이렇게 부분적으로 열어두는 경우는 괜찮은 것인지요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cascade 관련 질문입니다!
안녕하세요 김영한 강사님! 먼저 좋은 강의 만들어주셔서 감사합니다! 강의를 듣다가 cascade 관련하여 질문이 생겨서 질문 작성을 하게 되었습니다. 먼저 밑에 분이 먼저 해주신 질문과 강사님의 답변을 보고 cascade 옵션 자체는 연관관계 주인, 양방향등 관계 없이 1. 동일한 라이프 사이클, 2. 참조하는 주인이 private owner 일 때 라고 2가지 조건을 충족할 때 쓴다고 이해하게 되었는데, 그럼 order, orderItem, delivery에서 orderItem과 delivery가 각각 order만 참조하는, 다른 것이 참조할 수 없는 private owner인 건가요? private owner 라는 말에 대한 이해가 정확하게 되지 않아서 질문을 드립니다. 제가 이해한 것이 맞는 건가요? 감사합니다.
-
해결됨실전! Querydsl
강사님 컨트롤러에서 Pageable 사용 관련해서 질문드립니다.
강사님 안녕하세요. 강사님 덕분에 JPA 로드맵 강의를 알차게 배웠습니다. 갑자기 뜬금없이 생각났는데 컨트롤러에서 Pageable를 바로 사용할 경우 max size를 제한할 수 있는 방법은 없는건지요. 악의적으로 query String에 size값을 100000000 이렇게 찍어놓고 막무가내로 요청을 여러번 보낸다면 왠지 서버가 뻗을 것 같다는 생각이 들어서요. Pageable에서 최대 사이즈 막을 수 있는 방법이 없다면 따로 VO를 통해서 제한해 줘야하는 건지 궁금해서 질문드립니다.