25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JPA로 마주하는 성능 최적화에 대해
안녕하세요. 성능 최적화 방법에 있어 원초적인 질문을 하나 드리고자 인트로 강의에 질문을 작성하게 되었습니다. 인트로 강의 중에 성능 최적화로 고생하시는 분들 보면 5분 만에 최적화가 끝난 경우도 있다고 말씀주시면서, JPA는 많은 성능 최적화 옵션을 제공하는데 사람들이 이를 모른다고 말씀해주셨습니다. 이 부분을 제가 처음 들었을 때엔, 코드를 (구현한 알고리즘을) 최적화 하는 것보다 JPA의 기능을 더 많이 아는 것이 성능 최적화에 중요하다는 포인트로 느껴졌습니다. 이 부분에 대해 개발 경험이 정말 많으신 선배 팀장님으로서의 의견을 듣고 싶습니다. 만약에 맞다면, 개발 설계를 잘 하는 것도 중요하지만 이 부분은 유지보수 쪽에 가깝고, 결국 최적화는 기능 하나 더 아는 지에 따라 나뉘는 느낌이 들어서요.! 너무 원초적인 질문 같지만, 제가 경험이 없어, 경험이 많으신 개발 팀장 분의 의견을 듣고 싶어 질문을 남깁니다. 이렇게 개발 경험이 많으신 분께 여쭤볼 수 있다는 것이 굉장히 영광스럽습니다. 항상 감사드립니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV OFF 에 대한 질문
영한님 강의 언제나 감사한 마음으로 들으며 공부하고있습니다! 질문이있습니다. OSIV OFF 를 하여 영속성컨텍스트 생존 범위를 Service까지로 제한하게되면, Lazy 초기화를 하는 코드들을 전부 Service로 밀어 넣으면 되는 것인가요? 저는 초보 프론트엔지니어라서 그런지,, 서버는 보통 템플릿을 사용하지않고, RestAPI 를 만드는 쪽에 익숙하여서 강의내용과 이부분이 조금 다른것같아 혼동이 옵니다. 다시한번 정리하면, 저같은 경우에는 (Restful api 를 만드는 경우) 모든 지연로딩 초기화 코드는 service 혹은 repository에 밀어넣고 여기서 끝내어, Controller에서는 service에서 넘어온 것을 반환하는 것 정도까지 하면 될까요? 언제나 영한님의 친절한 답변 감사합니다 !!+ 추가질문으로 이런 코드는 service, repository 둘중 어디에 넣는 것이 더 좋을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
6:01 하는 무한루프 관련되서 예외가 나서 한번 올려봅니다.
먼저 강의 항상 잘 듣고 있습니다. @GetMapping("/api/v1/simple-orders")public List<Order> ordersV1() { List<Order> all = orderRepository.findAll(new OrderSearch()); return all; 이부분이 무한루프 나지 않고 두가지 에러가 뜹니다. 1. [THYMELEAF][http-nio-8080-exec-1] Exception processing template "api/v1/simple-orders": Error resolving template [api/v1/simple-orders], template might not exist or might not be accessible by any of the configured Template Resolvers 2. Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [api/v1/simple-orders], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause 이렇게 두가지가 일어납니다.쿼리가 잘못된줄 알고 orderRepository test를 했는데 각 id 는 잘 불러와지는건 확인 했습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Request 객체, Response 객체 질문
안녕하세요. 강사님 좋은 강의 우선 감사드립니다 :) Request 객체, Response 객체에서의 Validation Check는 어떻게 해야 효율적인가요? Member Entity에서는 별도 id에만 @notEmpty를 주는 것이 좋지 않다고 해주셔서요. 감사합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강사님 질문이 있습니다.
안녕하세요 강사님 질 좋은 강의 잘 듣고 있습니다. 다름이 아니라 제가 강사님 강의 들으면서 개인적은 프로젝트를 하려고 하는데 rset api형태로도 만들어 보고 싶은데 궁금한 점이 이것을 만들어서 어디에 사용되는지 궁금합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의 문서 오타 제보 드립니다.
안녕하세요 강사님 강의 문서를 보면서 코드를 작성하고 다시 강의를 돌려 보고 있습니다. 강의 문서 코드에 오타가 있어서 제보 드립니다. JPA2 BOOK의 가격이 20,000원인데 주문을 할 때 10,000으로 주문을 하고 있어서요 (강의 영상에서는 20,000원으로 주문하셨습니다.) 감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
fetch join outOfMemory경우에 대해서 질문드립니다.
강의 잘 듣고 있습니다! 질문이있는데 paging 시 fetch join을 하면 메모리에 모든 데이터를 가져와서 애플리케이션단에서 paging을 해주기 때문에 out of memory가 날 수 있다고 하셨는데 이 문제는 paging 할 경우 나오는 문제라기 보다 fetch join의 문제라고 생각하면 될까요? 만약 그렇다면 일대다 경우에서 fetch join을 쓸때 굉장히 조심해서 써야하는 건가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
junit으로 회원등록 API 테스트 코드를 만들어 보았습니다.
junit으로 회원 등록 API 테스트 코드를 만들어 보았습니다. @ExtendWith(SpringExtension.class)@SpringBootTest@AutoConfigureMockMvcclass MemberApiControllerTest { @Autowired MockMvc mockMvc; @Autowired ObjectMapper objectMapper;// @BeforeEach// void setUp(@Autowired MemberApiController memberApiController){// mockMvc = MockMvcBuilders.standaloneSetup(memberApiController).build();// } @Test @DisplayName("회원_등록API_V1") void 회원_등록ApiV1() throws Exception { //given MemberDto memberDto = new MemberDto("회원1"); final String jsonStr = objectMapper.writeValueAsString(memberDto); //when final ResultActions resultActions = mockMvc.perform(post("/api/v1/members") .contentType(MediaType.APPLICATION_JSON) .content(jsonStr) ).andDo(print()); //then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value("1")); } @Data @AllArgsConstructor static class MemberDto { private String name; } @Test @DisplayName("회원_등록API_V2") void 회원_등록ApiV2() throws Exception { //given MemberDto memberDto = new MemberDto("회원2"); final String jsonStr = objectMapper.writeValueAsString(memberDto); //when final ResultActions resultActions = mockMvc.perform(post("/api/v2/members") .contentType(MediaType.APPLICATION_JSON) .content(jsonStr) ).andDo(print()); //then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value("1")); } @Test @DisplayName("회원정보_업데이트V2") void 회원정보_업데이트V2() throws Exception { //given MemberDto memberDto = new MemberDto("회원3"); final String jsonStr = objectMapper.writeValueAsString(memberDto); //when final ResultActions resultActions = mockMvc.perform(post("/api/v2/members/1") .contentType(MediaType.APPLICATION_JSON) .content(jsonStr) ).andDo(print()); //then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value("1")) .andExpect(jsonPath("$.name").value("회원3")); } } 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
postman을 통해 다른 사이트의 entity의 전체의 내용을 출력할 수 있나요?
안녕하세요. 약간 수업 외 질문 같긴 하지만 질문 해도 될까요? 만약 어떤 사이트에서 검색기능을 구현했는데, DTO 없이 entity를 자체를 통해 출력하도록 설계를 했다면, 해당 설계된 웹 페이지에는 비밀번호 출력 기능이 구현되지 않더라도, postman 을 통해 json 방식으로 엔티티의 모든 데이타를 수집해서 비밀번호까지 알 수 있는 건가요? 뭔가 보안 상 문제가 있을 수 있겠다는 걱정이 듭니다 ㄷㄷ. 포스트맨이 엔티티 전체를 가져오는 막강한 기능을 보니까, 한계가 어디까지인지 궁금합니다! 감사합니다~
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문 조회 V4: JPA에서 DTO 직접 조회에서 QueryException 오류
안녕하세요 영한님. 위 강의 시간에 private List<OrderItemQueryDto> findOrderItems(Long orderId) { return em.createQuery( "select new jpabook.jpashop.repository.order.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count)" + " from OrderItem oi" + " join oi.item i" + " where oi.order.id = :orderId", OrderItemQueryDto.class) .setParameter("orderId ", orderId) .getResultList();} 이부분에서 em.createQuery 'select new ... ' 식으로 쿼리를 날리면 계속 에러가 나서요 저번 시간에도 위와같이 Dto에 직접 매핑하여 값을 가져올때도 에러가났었는데 어디가 틀린지 못찾겠습니다 ㅜㅜ... 커뮤니티 버젼이라 오타가 있겠거니 했는데 찾아도 안보여요 ㅜㅜ.. -- 로그부분 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryException: could not resolve property: status of: jpabook.jpashop.domain.Order [select new jpabook.jpashop.repository.order.query.OrderQueryDto(o.id, m.name, o.orderDate, o.status, d.address) from jpabook.jpashop.domain.Order o join o.member m join o.delivery d]; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: status of: jpabook.jpashop.domain.Order [select new jpabook.jpashop.repository.order.query.OrderQueryDto(o.id, m.name, o.orderDate, o.status, d.address) from jpabook.jpashop.domain.Order o join o.member m join o.delivery d]] with root cause org.hibernate.QueryException: could not resolve property: status of: jpabook.jpashop.domain.Order 항상 좋은 강의 감사드립니다.!!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
지연 로딩 질문드립니다.
질문. 지연로딩은 연관된 엔티티를 실제로 사용할ㄸ때 쿼리가 나가는데. (member.getTeam 프록시 객체익고 member.getTeam().getName() 하면 팀 엔티티를 조회하듯이) 그래서 지연로딩이 일어나는 위치가 2번째줄에서 일어나는게 맞는지 질문드립니다. orderItem.getItem()(연관된 엔티티 실제로 사용) 함으로써 프록시 초기확가 일어나서 orderitem을 조회하고, 여기서 getName() 에 의해서 프록시 초기확가 되어 item 조회 쿼리가 나가는게 맞는지 질문 드립니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 강사님 질문이 있습니다.
페이징 부분에서 말입니다. offset과 limit를 매개변수로 넣어줄때요 저는 이클립스 로그에 limit ?, ? 이렇게 찍히는데 강사님 강의 화면에선 limit ? offset ? 이렇게 찍히는데요 결과는 똑같이 나오는데요... 뭔가 잘못된거 같아서... 이게 왜 그런건가요;;; 제가 뭘 잘못한건가요? 제가 mariadb를 사용해서 그런건가;;; 근데 mysql이나 마리아db나 똑같지 않나요? 원래 mysql 페이징이 limt 1, 10 이런케이스로 써서 그런건가;;; 제 로그에는 limit ?,? 으로 찍히고 따로 offset은 안나오내요;;
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 강사님 질문이 있습니다.
엔티티를 DTO로 변환할 때 말인데요. 람다식이 제가 생소해서 사용을 하고 있긴한데 이게 엔티티를 DTO로 변환해줄때는 향상된 for문으론 안되나요? 버전 1에서는 프록시를 강제로 DB에서 초기화시켜주려고 향상된 for문을 사용하는거 같은데 버전2,3에서는 DB에서 꺼내온걸 DTO로 변환해줄때 람다식을 사용하잖아요. 이해하기 쉽게 for문으로는 변환이 안되는건가요? 아직 람다식이 생소해서요 ㅠㅠ
- 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
뷰테이블 질문입니다.
삭제된 글입니다
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@lob 관련하여 질문 드립니다.
안녕하세요!JPA를 활용하여 여러가지 조회테스트를 해보고 있는데 @lob 컬럼이 존재하는 경우 select시 쿼리가 매우 느린현상을 발견했습니다. @lob 컬럼이 존재하는 경우에 쿼리를 빠르게 수행할 수 있는 방법이 있을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
9분30초 findOrderDtos()관련 질문입니다.
안녕하세요 팀장님 프로그래밍 강의를 재미있게 듣기는 처음입니다. ^^ findAllWithMemberDelivery()과 달리 findOrderDtos()에서는 fetch join을 사용하면 에러가 발생합니다. return em.createQuery( "select new jpabook.jpashop.api.dto.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address) " + " from Order o" + " join o.member m " + " join o.delivery d ", OrderSimpleQueryDto.class ).getResultList(); <자바 ORM 표준 JPA 프로그래밍>에서는 SELECT m FROM Member m JOIN FETCH m.team 은 다음 SQL문과 같고 SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID 일반 JOIN인 경우 SELECT m FROM Member m JOIN m.team t 다음 SQL과 같다 하셨는데 SELECT M.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID 위에서는 join만 사용했는데 어떻게 member나 delivery를 별도 query로 참조하지 않고 가져왔는지 궁금합니다. 답변하신 내용중 https://www.inflearn.com/questions/23847를 참고하면 "fetch join을 사용하는 이유는 엔티티 상태에서 엔티티 그래프를 참조하기 위해서 사용하는 것입니다. 따라서 당연히 엔티티가 아닌 DTO 상태로 조회하는 것은 불가능합니다. 이 경우 fetch join을 사용하지 마시고, 그냥 순수한 join을 사용하시면 원하는 결과를 얻을 수 있습니다" 라 하셨는데 만약 위의 jpql에 fetch가 있었다면 엔티티 상태이기 때문에 에러가 나지 않고 추후 new를 통해 DTO로 변환해야 하는 것 아닌지요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Member 조회시 Order 조회관련
V1을 호출할때 Order가 db에 존재하는 상태에서 Members를 조회하니 fetchType.LAZY임에도 불구하고 Members안에 Order 있고 그 Order안에 Meber가 있고 그 Member안에 Order가 있는 무한 루프 데이터가가 되어 반환이 되는데 LAZY 타입이면 Order를 조회할 때 쿼리가 날라가는것이 아닌가요? 왜 이렇게 되는지 잘이해가 안가네요...
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
JpaRepository나 CrudRepository 같은 인터페이스에 @Repository 어노테이션이 안붙는 이유에 대해서 궁금합니다.
안녕하세요 김영한님! 요즘은 인턴이니 취업 준비니 바빠서 강의를 미뤄두고 못 보는 것 같습니다. 다시 초심으로 돌아와서 열심히 들어야하는데 ㅠㅠ 그래도 예전에 인터넷 강의를 하시면서 추천해주셨던 오브젝트라는 명서를 알게 되서 지금은 JPA보다는 약간 객체지향쪽을 열심히 공부중인거같아요. TDD나 BDD나 객체지향 원리를 적용하고 디자인 패턴도 고민해보고 그러고 있는 것 같습니다. 서론이 길었는데 제가 이번에 질문을 하게된 계기는 스터디원 중에서 `@Repository` 어노테이션에 관련해서 질문이 들어왔습니다. 제가 알기로는 Spring Data가 지원하는 `JpaRepository` 나 `CrudRepository` 인터페이스같은 경우에는 `@NoRepositoryBean`으로 등록되어 있는 것으로 알고 있습니다. 제가 여기저기 찾아보면서 답변을 했는데 이게 맞는 답변일지 궁금해서 질문을 드리게됐습니다. `@Repository`가 쓰이는 가장 큰 장점은 바로 `DataAccessExceptions` 핸들링 때문이라고 생각이 듭니다. 하지만, Spring Boot와 JPA를 사용하는 환경에서는 `@EnableAutoConfigure`을 통해서 DB 연동을 하기 때문에 `DataAccessExceptions` 같은 경우에는 액세스 오류가 예상되지 않은 케이스가 많고 익셉션이 발생해도 용도가 알 수 없는 부분이 있다고 생각합니다. 그래서 JPA의 경우에는 `PersistenceExcpetions`를 통해서 명확한 예외처리를 보여준다는 장점이 있다고 생각이 들었습니다. 그렇기에 `@Repository` 사용이 불필요하다고 생각이 들었으며, 인터페이스를 특정 Repository로 등록하는 것을 방지하기 위해서 `@NoRepositoryBean`을 통해서 관리된다고 생각합니다. 이렇게 함으로써 확장이 가능하도록 하기 위해서라고 생각이 듭니다. 그 대신 이러한 인터페이스를 구현해서 사용하는 인터페이스들을 컴포넌트 스캔단에서 빈으로 주입해주는 것으로 보입니다. 즉, `DataAccessExceptions`을 더 이상 사용하지 않는 문제와 인터페이스가 `@Repository`로 빈등록이 되면 확장의 어려움때문에 `@Repository`를 사용하지않는다 답변했는데 맞는 답이 될 수 있을까요? 아 추가적으로 해당 인터페이스를 상속했을 때 컴포넌트 스캔시 어떤 방식으로 해당 인터페이스에 빈을 주입해주는 지도 궁금합니다. basePackage 스캔하면서 implements 된 인터페이스들을 확인하고 주입해주는 거일까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
message가 공백으로 나올 때
start.spring.io에서 강의 버전보다 높게 설정되어서 그런지 몰라도! 포스트맨으로 같은 name을 두개 post 보내면!! 아래와 같이 message는 빈 문자열이고 , stacktrace는 보이지 않습니다. 저는 여기서 1편 복습을 제대로 안했구나 어느 코드에서 error가 있는건지 멘붕이 터지게 됩니다 ㅠ ㅜ { "timestamp": "2020-12-22T13:15:21.478+00:00", "status": 500, "error": "Internal Server Error", "message": "", "path": "/api/v1/members" } 그러다가 인터넷에 메시지 전달 안되는걸 대략 쳐보니... main에 있는 application.yml에 server error를 설정해주면 해결 된다는것을 발견했습니다. 저처럼 처음 스프링을 접하는 사람은 강의와 조금만 달라져도 당황.. 그 자체!! 아래와 같이 입력 해주시면 강의 똑같은 postman 결과값을 받아 볼 수 있습니다. server: error: include-stacktrace: always include-message: always message, trace도 정상 출력 !! { "timestamp": "2020-12-22T13:23:30.272+00:00", "status": 500, "error": "Internal Server Error", "trace": "java.lang.IllegalStateException: 이미 존재하는 회원입니다\n\tat jpabook.jpashop.service.MemberService.validateDuplicateMember(MemberService.java:31)\n\tat jpabook.jpashop.service.MemberService.join(MemberService.java:23)\n\tat jpabook.jpashop.service.MemberService$$FastClassBySpringCGLIB$$560b731b.invoke(<generated>)\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)\n\tat org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367)\n\tat org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)\n\tat jpabook.jpashop.service.MemberService$$EnhancerBySpringCGLIB$$8d95fa39.join(<generated>)\n\tat jpabook.jpashop.api.MemberApiController.saveMemberV1(MemberApiController.java:23)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:564)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:652)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:832)\n", "message": "이미 존재하는 회원입니다", "path": "/api/v1/members" }
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 강사님 질문있습니다.
첫번째로 제가 api란 용어를 application program interface라고 알고 있는데 맞나요? 두번째는 1번째 강의에서 만든건 API라는게 적용이 안된 프로젝트인가요? API개념이 햇갈려서요;;; 세번째로는 postman을 깔긴 깔았는데요 왜 이걸로 테스트를 하는거에요? 그냥 첫강의때처럼 쌩으로 크롬같은데서 켜서 하는거랑 무슨차이인가요? 네번째는 @RequestBody에 대해서인데요. 이 어노테이션이 파라미터에 붙으면 ajax에서 json 형태로 전송하면 그 전송한걸 받는 곳에 이걸 붙으는걸로 알고 있는데 맞나요? 그래서 postman에서 json형태로 컨트롤러쪽에 post형태로 쏴줬으니 저 어노테이션을 붙인 곳에 바인딩된다고 생각을 하면 되는게 맞지요?