묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 데이터 JPA
Entity 사용에 대한 질문
안녕하세요. 강사님 먼저 항상 좋은 강의를 해주셔서 감사합니다. 제가 실무에서는 Mybatis만 사용하다, 강사님 강의를 통해서 처음 JPA를 접하고, 개인 프로젝트에서 처음 JPA를 사용하고 있습니다. 강의에서 Entity를 직접 반환을 하면 안된다고 하신걸로 기억을 하는데, API 개발 시 리턴을 할 때만 직접 Entity로만 반환을 하면 안되지는 일반 MVC 형태의 개발을 할 때는 직접 Entity를 반환하는 방식을 실무에서 사용을 하시는지 궁금합니다. 저는 평소 Controller에서 파라미터를 받을 때 @ModelAttribute를 이용해 DTO를 통해 파라미터를 받는 방식을 주로 이용하는데, JPA 사용 시 @ModelAttribute를 이용하여 직접 Entity를 받는 방식은 좋은 방식인지 궁금하여 질문 드립니다. 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v2 api의 delivery 쿼리 조회문
안녕하세요 영한님! 간단한 주문 조회v2 질문이 있습니다. @GetMapping("/api/v2/simple-orders")public Result ordersV2() { List<Order> orders = orderService.findAll(new OrderSearch());//프록시가 들어있는 orde 객체 List<SimpleOrderDto> collect = orders.stream().map(o -> new SimpleOrderDto(o.getId(), o.getMember().getName(), o.getOrderDate(), o.getStatus(), o.getDelivery().getAddress())). collect(Collectors.toList()); return new Result(collect);} 위의 v2 api를 실행하면 문제없이 5개의 쿼리문이 나가는 것을 확인했습니다. name을 조회하는 쿼리는 예상했던데로 단순 조회 쿼리인 select member0_.member_id as member_i1_5_0_, member0_.city as city2_5_0_, member0_.street as street3_5_0_, member0_.zipcode as zipcode4_5_0_, member0_.name as name5_5_0_ from member member0_ where member0_.member_id=? 와 같이 나가지만. delivery 엔티티에 접근할때 select delivery0_.delivery_id as delivery1_2_0_, delivery0_.city as city2_2_0_, delivery0_.street as street3_2_0_, delivery0_.zipcode as zipcode4_2_0_, delivery0_.status as status5_2_0_, order1_.orders_id as orders_i1_6_1_, order1_.delivery_id as delivery4_6_1_, order1_.member_id as member_i5_6_1_, order1_.order_date as order_da2_6_1_, order1_.status as status3_6_1_ from delivery delivery0_ left outer join orders order1_ on delivery0_.delivery_id=order1_.delivery_id where delivery0_.delivery_id=? 위와 같이 외부 조인문이 나가는 것을 확인했습니다. 마치 패치조인을 한거 같은 전혀 예상치 못한 쿼리문이여서 질문을 드립니다. 또한 모두 lazy로 설정을 했습니다. 혹시 데이터베이스의 방언차이 때문일까요? mysql 사용중입니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
401 Unauthorized
postman으롷 127.0.0.1:port로 /login 호출 시에 401에러가 나는데 왜그런걸까요..? login api 호출 시 loadUserByUserName 메서드 타서 user정보 가져오는거까진 디버그로 확인했는데, 해당 값 user로 감싸서 리턴 후에 응답이 저렇게 나오는데 이유를 모르겠네요.. 참고로 permitAll로 진행중입니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
getTotalPrice같은 조회함수가 왜 필요한지 모르겠씀니다=_=
totalPrice라는 변수를 만들어서 처음 주문 들어왔을떄 계산해서 넣어두고, 주문 취소라던지 하는 변경이 일어나면 그때 상황에 맞게 업데이트 해주는게 맞는거 아닌가요?? 일반적으로 변경보다는 조회가 빈번하니까 변경되었을때 미리 계산해두고 조회할떄는 가져다 쓰기만 하는게 더 맞지않나 싶어서요=_=
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
spring security
java.lang.NoSuchMethodError: org.springframework.plugin.core.PluginRegistry.of([Lorg/springframework/plugin/core/Plugin;)Lorg/springframework/plugin/core/PluginRegistry; pom.xml에 시큐리티만 추가했을뿐인데 저렇게 에러가 터지네요 현재 스프링부틑 2.4x를 사용중입니다. 스웨거는최신 3.0사용중입니다.
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
HATEOAS질문드립니다
UserControll쪽에 최신으로 올려주신 package com.example.restfulwebservice.user;import org.springframework.data.crossstore.ChangeSetPersister;import org.springframework.hateoas.CollectionModel;import org.springframework.hateoas.EntityModel;import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*;import org.springframework.web.servlet.support.ServletUriComponentsBuilder;import javax.validation.Valid;import java.net.URI;import java.util.ArrayList;import java.util.List;import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;@RestControllerpublic class UserController { private UserDaoService service; //생성자를 통한 의존성 주입 public UserController(UserDaoService service) { this.service = service; } @GetMapping("/users") public List<User> retrieveAllUsers() { return service.findAll(); } // 전체 사용자 목록 @GetMapping("/users2") public ResponseEntity<CollectionModel<EntityModel<User>>> retrieveUserList2() { List<EntityModel<User>> result = new ArrayList<>(); List<User> users = service.findAll(); for (User user : users) { EntityModel entityModel = EntityModel.of(user); entityModel.add(linkTo(methodOn(this.getClass()).retrieveAllUsers()).withSelfRel()); result.add(entityModel); } return ResponseEntity.ok(CollectionModel.of(result, linkTo(methodOn(this.getClass()).retrieveAllUsers()).withSelfRel())); } //우리는 id를 숫자로 해도 서버측에 전달 될 경우에는 -> String으로 된다 //id로 하면 자동으로 원하는 int에 맞게 찾아준다 //HETAOS를 적용하면 개발자의 양은 많아지지만 //내가 개발한 것을 보는 사용자입장에서는 더 많은 정보를 알 수 있다 // 사용자 상세 정보 @GetMapping("/users/{id}") public ResponseEntity<EntityModel<User>> retrieveUser(@PathVariable int id) { User user = service.findOne(id); if (user == null) { throw new UserNotFoundException("id-" + id); } EntityModel entityModel = EntityModel.of(user); WebMvcLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers()); entityModel.add(linkTo.withRel("all-users")); return ResponseEntity.ok(entityModel); } //post, put 처럼 데이터 맵핑 할려면 파라미터에 request body로 형식을 적어줘야한다 @PostMapping("/users") public ResponseEntity<User> createUser(@Valid @RequestBody User user) { User saveUser = service.save(user); URI localtion = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{id}") .buildAndExpand(saveUser.getID()) .toUri(); return ResponseEntity.created(localtion).build(); } @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable int id) { User user = service.deleteById( id); if(user == null) { throw new UserNotFoundException(String.format("ID[%s] not found ", id)); } }}사용했는데 에러가 발생했습니다 ㅠㅠorg.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.plugin.core.PluginRegistry<org.springframework.hateoas.client.LinkDiscoverer, org.springframework.http.MediaType>' available: expected single matching bean but found 3: relProviderPluginRegistry,linkDiscovererRegistry,entityLinksPluginRegistry
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
swagger 연동을 할려고 하는데 에러가 발생합니다
지금 현재 swagger 해보고 있는데 org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NoClassDefFoundError: javax/validation/constraints/NotBlank 이런 에러가 발생했습니다 구글링 해보니 이거 버전 안맞다는 말이 많더라구요 버전은 강의를 보면서 하고 있어서 최신 버전을 했는데 다른 문제를 모르겠습니다 ㅠㅠ ㅇㄹㅇㄹㅇㄹ
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
localhost가 다르게 출력될 경우?
이런식으로 host.internal.docker가 출력되는 경우는 무엇일까요..?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
p6spy 성능 질문 드립니다.
안녕하세요. 강의를 듣고 사이드 프로젝트를 하면서 `p6spy` 를 잘 활용하고 있는데요. 강의 내용 중에 prod 에서는 성능 관련을 확인 후 사용해야 된다는 내용을 보고 궁금해졌습니다. 처음에는 그냥 `build.gradle` 에서 prod 설정에만 안뜨게 하면 되겠지 (dev, test 에서는 되는 것을 의도) 라고 생각했는데, profile 에 따라 `build.gradle` 이 동적으로 움직이는 건 application.xml 이랑은 다르게 좀 어렵더라구요; 그래서 질문은 2개 입니다. 1. profile 에 따라 `build.gradle` 의 설정 (특히 dependency) 이 동적으로 움직이게 하는 것을 어떻게 하면 좋을까요? 2. `p6spy` 와 같은 외부 라이브러리의 성능 검증은 어떻게 하는 것이 좋을까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
JWT 다중 로그인 처리 질문
user-service에서 AuthenticationFilter를 거치기전 기존에 메모리나, DB에 해당 ID에대한 JWT토큰값이 존재할 경우 기존 토큰은 폐기하고 새로운 토큰값을 발급시켜 새로 로그인한 유저에게 할당해주는 방법으로 하면 괜찮을까요 ??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderController에 대해서 궁금한게 생겼어요
안녕하세요!! 컨트롤러를 보다가 단순 호기심이 생겨서요 MemberController와 ItemController에서는 회원가입을 하거나 상품을 등록할때, MemberForm클래스나 ItemForm클래스를 만들어서 파라미터값으로 넘겨주셨습니다. 그런데 OrderController에서는 주문을 할 때 OrderForm을 만들지 않고, 하나하나 @RequestParam으로 넘겨준 특별한 이유가 궁금해서 질문드렸어요 별다른 이유가 없으면 OrderForm을 만들어서 넘겨도 되는거죠??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
map<Long,Member>를 넣은 이유가 궁금합니다!
Member class에는 long id, String name을 가지고 있어서 id값에 Long을 주는건 이해가 되는데 name값을 넣어주려면 Member가 아니라 String이 들어가야되는게 아닌가요?? 잘 이해가 안되서 설명 부탁드리겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강사님 프로그램 시작시 질문있습니다
제가 야생형 코스를 따라가고 있어서 아직까지 이해가 잘 가지 않고 그냥 따라치기 바쁘네요 ㅎㅎ 다름이 아니라 JPA를 사용하면 어플리케이션 실행 할때마다 테이블을 계속해서 만들고 시작하나요 ?? 그리고 제가 디비가 약해서 디비 관계에대해 잘 이해 못하는 부분들이 조금씩 있고 각 어노테이션들의 기능들을 기본편을 보지않고 와서 그런지 모르고 가고 있는데 계속해서 진도 진행해도 될까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
extends JpaRepository<> vs @Repository 질문
안녕하세요 기본편 강의 잘 들었습니다! 질문이 하나 있는데, DB에 접근하는 클래스를 만들 때 스프링 공식 사이트에서는 extends JpaRepository<> 있고 현재 강의에서는 @Repository로 접근을 하는데 둘의 차이가 있는 것 인가요? 추상적인 질문이었다면 죄송합니다 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Transactional 어노테이션 질문드립니다
안녕하세요 영한님 Jpa 로 단순 조회기능을 이용하게될때 Service Layer 에서 @Transactional(readOnly=true) 를 메소드에 선언해서 사용했었는데요 테스트하다보니 @Transactional 어노테이션 없이 사용해도 조회도되고 controller 단에서도 영속성컨텍스트가 살아있는걸로 확인이 되었습니다 (osiv 는 켜놓았습니다) findById or findAll 같은 단순 조회기능에서는 @Transactional 은 없어도 되는건가요? spring 에서는 기본적으로 트랜잭션범위와 영속성컨텍스트의 범위가 동일하다고 알고있는데 @Transactional 설정을 안해줘도 조회기능에선 영속성컨텍스트가 유지된다고 보면될까요 ? 아니면 @Transactional(readOnly=true) 는 @Transactional 없이 동작하는것과 어떤 차이가 있는걸까요 ㅠㅠ
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
token_secret 변경후 인증부분에 대하여
안녕하세요. 좋은 강의 정말 감사드립니다. 12:12무렵에 token_secret 변경-> busrefresh 후인증할때 Bearer Token의 token값을 변경하지 않아도... debug시 token_secret이 busrefresh로 변경된 값으로 확인 되지만정상적으로 인증 되는것을 확인했습니다. 로그인시 적용된 token_secret 아래의 값입니다. user_token_native_application_#2 이상해서 아래와 같이 다른 값으로 변경후 user_token_native_application_#4 user_token_native_application_#5 user_token_native_application_#9 busrefresh하고 health_check URL을 확인했지만 마찬가지로 인증이 잘되었습니다. 이상한건 아래와 같이 코드를 바꾸면 user_token_native_application_#10 user_token_native_application_#14 user_token_native_application_#17 401Unauthorized 로 정상적인 결과가 나왔습니다. 제 생각으론 # 뒤의 숫자값보다는 자릿수만 인지한거같습니다. 이런생각으로 아래와 같이 숫자를 영문으로 변경해 시도해봤더니 인증이 되었습니다. user_token_native_application_#z 그리고 또 아래와 같이 영문을 두자리수로 늘려봤더니 user_token_native_application_#za 제 생각처럼 숫자든 영문이든 관계없이 자릿수2개로 인지해 인증이 되지 않았습니다. 이런 제 생각이 맞을까요?엉뚱하지만.. 맞아도 이상하고 안맞아도 이상해서 질문드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
ItemServiceImpl.java 클래스를 만들지 않은 이유
강사님 안녕하세요, 강의를 듣다 궁금한 점이 있어서 글 올립니다. 보통 ItemService 같은 서비스 클래스는 구현체를 만드는 것으로 알고 있는데, 혹시 강의처럼 ItemServiceImpl 클래스를 안만들고 바로 구현해도 크게 문제되지는 않는건지 궁금합니다. (JPA라서 그런건지 아니면 예제이기 때문에 단순화 시키신건지 등 ..) 답변 부탁드리겠습니다! 감사합니다!!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
자바 코드로 직접 스프링 빈 등록하기 예제에서 에러가 발생합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 스프링 빈과 의존관계에서 자바코드로 직접 스프링빈 등록하기부분을 듣고있습니다. 회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션을 제거하고 @bean 설정할때 @Bean public MemberService memberService(){ return new MemberService(memberRepository()); } 에서 에러가납니다. 에러 메시지는 ' java: incompatible types: hello.hellospring.repository.MemberRepository cannot be converted to hello.hellospring.repository.MemoryMemberRepository' 입니다. 캐스팅해야한다고 뜨는데, 수업화면에서는 별도 캐스팅없어도 오류가 발생하지않더라구요 ㅠ 제가 어느부분을 놓친건지 모르겠습니다 ㅠㅠ package hello.hellospring.repository; import hello.hellospring.domain.Member; import java.util.List; import java.util.Optional; public interface MemberRepository { Member save(Member member); Optional<Member> findById(Long id);//널일경우 대비 Optional<Member> findByName(String name); List<Member> findAll(); } package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.springframework.stereotype.Repository; import java.util.*; public class MemoryMemberRepository implements MemberRepository{ private static Map<Long,Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId(++sequence); store.put(member.getId(),member); return member; } @Override public Optional<Member> findById(Long id) { return Optional.ofNullable(store.get(id)); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } public void clearStore(){ store.clear(); } } package hello.hellospring.service; import hello.hellospring.repository.MemberRepository; import hello.hellospring.repository.MemoryMemberRepository; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SpringConfig { @Bean public MemberService memberService(){ return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository(){ return new MemoryMemberRepository(); } }
-
미해결실전! 스프링 데이터 JPA
findById 반환타입 Optional
안녕하세요 선생님. 좋은 강의 매번 감사합니다! 강의를 듣고 토이프로젝트중에 질문이 생겼습니다! 강의 21분쯤에 스프링 데이터 JPA가 제공하는 findById의 반환값을 받아올때 반환값이 없을 수도 있기 때문에 Optional이고 강의에선 편의상 get()으로 가져온다고 하셨습니다! 강의에서 orElse 로 처리한다고 간단하게 언급해주셨는데, 실무에서는 그럼 위와 같은 상황에서 어떤식으로 가져오나요? 관련되어서 조사를 해보았는데 orElse로 값이 없을때 반환할 값을 넣어준다고 하더라구요. 그럼 이 테스트에서는 값이 없을때 반환할 객체 하나 생성해두고 orElse에 넣으면 되는건가요?
-
미해결실전! 스프링 데이터 JPA
서버가 여러대일때 createdDate, updatedDate 처리?
안녕하세요. 보통 createdDate 나 updatedDate 같은걸 등록할때 서버쪽에서 시간을 얻어서 등록하나요? 만약 서버가 여러개 있다고 할때 각 서버마다 아주 미세하게 시간이 다를수도 있을거 같은데요. 그럼 실제 A서버에서 등록한 시간이 B서버에서 등록한 시간보다 느린데 빠르게 등록될수도 있을거같아서요. 차라리 db에서 제공하는 default값이나 트리거등으로 값을 넣어주는게 확실하고 더 낳지 않나요? 실무에선 보통 어떻게 처리하는지 궁금합니다. 1. 외부타임서버에서 가져오는건 시간 텀이 있을수 있으니 내부에 NTP서버를 두고 시간갱신을 한다. 이떄 NTP클라이언트들의 시간갱신을 텀을 보통 얼마나 주는지도 궁금합니다. 24시간씩 두지는 않을거 같고 6시간? 1시간? 10분? 2. 시간이 중요할거 같으면 db에서 처리한다. 그리고 시간업데이트할떄 연관된 엔티티끼리의 createdDate 시간은 같이 맞추나요? 아님 조금 차이가 나둬 상관없으니 각각 시간을 구해서 업데이트하나요? 아님딱히 중요한건 아니니 그냥 개별로 업데이트 하나요? 예를들어 ORDER, ORDER_ITEM, DELIVERY, ORDER_HISTORY(ORDER와 N:1의 crud내역) 엔티티가 있을때 같은 주문일경우 각각의 엔티티의 시간을 똑같이 맞추나요? 아님 시간차이가 조금 나도 상관없으니 그냥 엔티티별로 createdDate, updatedDate를 업데이트하나요? 그리고 새 강의 계획은 언제쯤 인지 알수 있을까요?