묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
페이징 관련 질문입니다.
안녕하세요! 16:39초 정도까지 강의를 듣다보면 DTO로 변환해서 넘기는 모습을 볼 수 있습니다. 그런데 응답값을 확인해보면 totalElements, last, size, number, sort, first, empty 등 페이징에 관련한 모든 필드들이 나가더라구요. 그냥 클라이언트에서 필요한 부분만 정제해서 내보내야할 것 같은데 실무에서는 어떠한 방법을 사용하나요?
-
미해결실전! 스프링 데이터 JPA
slice 관련 질문입니다
slice 의 경우 size 3으로 요청하면 limit 가 4로 나가는데요, 이렇게 하면 실제로 쿼리를 돌려보면 결과가 4개가 나옵니다. 그런데 content.size() 가 3이 나오는 이유는 뭔가요? 스프링데이터 JPA 에서 알아서 마지막 결과는 날려버리는 건가요?
-
미해결실전! 스프링 데이터 JPA
CQRS 리포지토리 질문
안녕하세요. 이전부터 말씀해주신 CQRS에 관해서 간단한 질문이 있습니다. 예를 들어 Member엔티티에 관해 아래처럼 2개의 레포지토리로 쪼갠다고 가정할게요. - MemberQueryRepository(읽기) - MemberCommandRepository(쓰기) 저희가 JPA Data의 이점을 살리려면 JpaRepository를 상속받아서 사용한다고 강의에서 배웠는데요. 읽기 관련 쿼리가 들어있는 Query와 쓰기 관련 쿼리가 들어있는 Command 2개의 레포 모두 JpaRepository를 상속받아서 사용하나요? JpaRepository에는 단순 find~로 시작하는 읽기 메소드뿐만 아니라 delete, save등 쓰기에 관한 메소드도 같이 들어가있어서 읽기/쓰기 레포에서 모두 상속받아서 사용한다면 나중에 작업을 할 때 단순 조회/저장/삭제 등을 어떤 레포에서 사용해야할 지 혼란이 올 것 같습니다. CQRS에 대해서는 이론만 알고있었지 실제로 적용해본적이 없어서 많이 혼란스럽네요. 감사합니다 :)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 빈의 자원공유 관련 질문드립니다
이번에 회사에서 Spring Security로 동적 ACL을 개발하다가 사용자 별로 독립적인 권한을 주고, 이 권한에 따라 사이드메뉴에 보이는 항목들을 다르게 해주었는데요. 이때 모든 쓰레드가 각 권한별로 갖고있는 리소스 접근권한 정보에 대해 알게하고 싶어(사이드 메뉴를 렌더링해야 하므로) 스프링 빈을 하나 만들고 이 빈에 해당 정보를 공유자원으로 등록했습니다. 자료구조는 ConcurrentHashMap을 썼습니다. 모든 쓰레드가 공유해야 할 자원이라 스프링 빈을 썼고 이로 인해 어떤 문제가 발생할 수 있을지 곰곰히 고민해봤는데 대략적으로 어떤 문제들이 발생 할 수 있는지 잘 모르겠습니다. 대부분의 스프링 책과 강의들에선 스프링 빈은 모든 쓰레드에서 상태를 공유하므로 사용에 주의를 기울여야 한다라거나 불변해야 한다는 이야기를 많이하지만, 자원을 공유하기 위해 스프링 빈을 쓰라는 얘기는 못봤었거든요. 왜 공유해야만 하느냐면 이렇게 하지 않으면 유저별로 로그인할때마다 데이터베이스에서 자신이 갖고있는 리소스 접근권한을 모두 검색해서 가져와야만 하는데, URL의 개수가 너무 많았기 때문입니다. 혹시 어떤 문제가 발생할 수 있을지, 더 좋은 방법은 없었는지에 대해 의견을 구합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 빈의 역할이 무엇인가요?
안녕하세요! 스프링 빈의 역할이 무엇인지 잘 모르겠습니다..! 빈 자체의 개념이 이해가 안가서 서치를 좀 해보니" 매번 클라이언트에서 요청이 올 때마다 각 로직을 담당하는 오브젝트를 새로 만들어서 사용한다고 생각해보자 요청 한 번에 5개의 오브젝트가 새로 만들어지고 초당 500개의 요청이 들어오면, 초당 2500개의 새로운 오브젝트가 생성된다. 서버가 감당하기 힘들다."그래서 빈이 필요하다 라는 말을 봤는데 그 필요성은 알겠으나 정확하게 빈이 무엇인지 모르겠습니다 또한 왜 new로 선언하면 빈이 되지 못하는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방향 연관관계에서의 편의 메서드
강의중, 연관관계 편의 메서드는 연관관계의 주인으로 설정된 엔티티에서 형성하는 것이 좋다고 하셨는데 Order 엔티티에 //연관관계 메서드public void setMember(Member member) { this.member = member; member.getOrders().add(this);}public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this);}public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this);} 이렇게 메서드를 구성했습니다. 그러나 Order - OrderItem 두 엔티티가 갖는 연관관계에서 주인은 OrderItem입니다. 그렇다면 Order에 .addOrderItem()을 없애고 OrderItem 엔티티에 public void setOrder(Order order){ this.order = order; order.getOrderItems().add(this);} 위와 같은 편의 메소드를 추가하는것이 맞지 않을까 질문합니다!
-
미해결스프링 핵심 원리 - 기본편
NoSuchBeanDefinitionException 질문드립니다.
안녕하세요 강사님! MemberService memberService = ac.getBean(MemberService.class); 에서 다음과 같은 오류가 발생합니다. org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.member.service.MemberService' available 그래서 @Component와 @Autowired 를 잘못 넣었나 해서 찾아봤는데요. 다음과 같이 작성하였고, 어떻게 해결해야 할지 조언 부탁드려도 될까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
개인 프로젝트를 위해 도움 요청합니다!
안녕하세요. 비전공자로써 국비지원 학원을 수료한 취준생입니다. 학원에서 만들었던 프로젝트가 포트폴리오로 내세우기에는 너무나도 부족해서 선생님의 강의를 들으며 프로젝트를 새로 만들 계획입니다. 프로젝트를 만드는 과정에서 무척 궁금한 부분이 생겼는데 바로 '이미지 첨부'에 관한 것입니다. 학원에서 프로젝트를 만들 때는 모르는 부분이 있으면 구글링하고 이것저것 헤딩해보면서 하다보니 그때 사용했던 방법은 Multipart를 통해 이미지를 프로젝트 파일 내에 있는 폴더에 저장하는 방식을 사용했습니다. 하지만 돌이켜 생각해보니 이미지를 많이 사용하는 사이트를 만든다고 했을 때, '프로젝트 파일의 용량이 너무 불어나면 안 좋지 않을까?' 하는 생각이 들었고, 또한, 기왕에 프로젝트 제대로 만들어 볼 거 AWS Free tier를 활용해서 배포까지 해야 취업에 유리하지 않을까 싶어서 배포단계까지 가는 것을 목표로 하고 있는데요. 그렇다고 했을 때, 배포 중인 애플리케이션의 이미지 첨부 기능에 에러사항이 있지는 않을까, 하는 걱정이 앞섭니다. (아직 애플리케션을 배포해 본 경험은 없습니다...) 사실, 구글 클라우드 스토리지라는 것이 있다기에 연동은 해봤지만 제대로 활용해보지는 못했습니다. 필요하다고 하면 다시 제대로 배워 볼 생각입니다. 이하 각설하고 제 질문은, 1. 실무에서 이미지 첨부 기능을 주로 어떤 스토리지 방식에 의존하는지 2. 작은 규모의 프로젝트이지만 이미지가 약 100장(+이미지 첨부 게시판) 정도일 때 어떤 스토리지 방식을 채택하는 것이 좋을지 입니다. 이게 참... 강의 주제에 벗어나는 질문이지만 너무 궁금한 부분이고, 비전공자이다보니 주변에 실무 종사자 분들이 없어서 실례를 무릅쓰고 이런 질문을 올려보게 되었습니다. 혹시라도 다른 실무 종사자 분들의 조언이 또 있다면 감사히 받겠습니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
순 자바 프로젝트에서 Spring 및 JdbcTemplate 사용
안녕하세요. 질문을 적다 보면, 영한님도 분명히 비슷한 고민을 한 적이 있을 것이다...라고 희망 섞인 상상을 합니다. 질문자에 공감이 된다면 더 좋은 답변이 나올 것이기 떄문이죠.^^ 물론 아니라도 명답을 주시겠지만~ Spring이 framework으로써 기능은 반드시 Web app에만 국한하지는 않을 것입니다(그렇죠??). Web app이 아닌 순 Java application에서 Spring 및 JdbcTemplate 사용을 위해 dependencies 선택은 어떻게 하는 게 좋을까요? 1. 예를 들어 spring-webmvc의 dependies는 다음과 같은데, spring-app spring-beans spring-context spring-core spring-expression spring-web spring-core만 포함하면 될까요? 혹은 이들 중 몇몇 가지를 잘 골라서 포함해야 할까요? 2. 복잡하게 하지 말고 Web 기능이 없더라도 그냥 org.springframework:spring-webmvc 를 포함해서 빌드하고 미사용 라이브러리는 최적화를 통해 빌드 사이즈 줄이도록 하는 계획이 나을까요? 2번의 선택이 적절하다면 마찬가지로 DB 코딩이 필요할 때, 속말로 앗싸리, org.springframework:spring-jdbc, 혹은 여기에 HikariCP까지 쓰고자 한다면 org.springframework.boot:spring-boot-starter-jdbc를 쓰는 것이 낫겠네요? 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러 매핑 방식이 궁금합니다
안녕하세요! 어댑터 이후 머릿속이 복잡해서 질문이 많더라도 양해부탁드립니다ㅠㅠ 1. 이전에 했던 V5에서는 프론트 컨트롤러 생성자에서 핸들러와 핸들러어댑터 매핑이 이루어졌는데, 스프링에서도 DispatcherServlet이 생성될때 매핑을 하는것인가요? DispatcherServlet도 스프링 컨테이너에 빈으로 등록이 되는건가요? 2. @Component("/url")등이 스프링 빈으로 등록될 때 스프링에서 자동으로 RequestMappingHandlerMapping과 BeanNameUrlHandlerMapping등의 Map객체에 넣어놓고 필요할때 조회하는 방식이 맞나요? 아니면 BeanNameUrlHandlerMapping등이 함수처럼 요청이 생겨 필요할때 빈들을 돌아가며 찾는것인가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
백엔드 개발자의 커리어
안녕하세요 영한님! '자바 ORM 표준 JPA 프로그래밍' 책을 공부하면서 영한님을 알게 되었고, 지금은 인프런 강의를 보면서 거의.. 팬이 되어버렸네요.. 하하핳 지금 웹 개발 실무를 원리도 모른 채로 약간의 감으로 하고 있어서 영한님 스프링 강의를 접하게 되었는데, 강의도 너무 재미있게 해주시고, 실무 위주의 핵심 원리들을 이해할 수 있게 되어 2021년에 영한님 스프링 시리즈를 모두 들어보기로 목표를 세웠습니다! ㅎㅎ 서론이 길었는데.. 제가 궁금한 것은!! 직장을 다니면서 백엔드 개발자 커리어를 깊이 있게 쌓고 싶은데, 1. 어떻게 하면 영한님처럼 직장을 다니시면서 책 집필과 교육을 진행할 정도의 전문성을 키우실 수 있을지 궁금합니다! 2. 또 프로젝트에 적용할 수 있는 새로운 기술들을 접하기 위해 책, 스터디, 토이 프로젝트, 온라인 강의 등.. 여러 경로가 있겠지만 영한님만의 또 다른 경로가 있는지 궁금합니다!
-
미해결실전! 스프링 데이터 JPA
Unit Test 관련 질문입니다.
안녕하세요 영한님 ! 어제 h2 관련해서 질문을 드렸었는데요 좋은 답변 감사했습니다! 다름이 아니라 service unit test 를 하는 과정에서 repository 의 Pageable 을 mock 으로 주입해야 하는 상황이 왔습니다. 현재 junit 5 의 bdd 를 이용해서 테스트를 하고 있는데요, junit5의 bdd 역시 영한님은 잘 아시겠지만 given()을 이용해서 JpaRepository.findAll(Pageable pageable) 이 호출되면 willReturn() 으로 반환되는 반환 값을 가짜로 주입해야 하는 상황입니다. 하지만 여기서 어떻게 Page<Entity> pagedEntitied 를 주입해야 하는지 몰라 진행이 힘들더라구요 ㅠㅠ 수업의 방향과 상관 없는 내용이라 실례임을 인지하고 있지만 어떻게 해결해야 할지 도통 갈피를 못 잡아서 질문드려 봅니다.. import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; class MemberServiceTest { private MemberService memberService; private final MemberRepository memberRepository = mock(MemberRepository.class); @BeforeEach void setUp() { ModelMapper modelMapper = new ModelMapper(); modelMapper.getConfiguration() .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE) .setFieldMatchingEnabled(true); memberService = new MemberService(memberRepository, modelMapper); // 문제의 willReturn 반환 타입.. 현재는 null을 넣어놨습니다. given(memberRepository.findAll(any(PageRequest.class))).willReturn(null); } @Test @DisplayName("모든 사용자 조회") void getMembers() { // when PageRequest pageRequest = PageRequest.of(0, 5); // then Page<MemberResponseData> pagedData = memberService.getMembers(pageRequest); assertEquals(pagedData.getSize(), 5); } } @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Member extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String email; private String password; private String nickname; public static MemberResponseData fromEntity(Member member) { return MemberResponseData.builder() .email(member.getEmail()) .nickname(member.getNickname()) .build(); } } // Page<MemberResponseData>에 해당하는 MemberResponseData(DTO) @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class MemberResponseData { private String email; private String nickname; } // MemberService @Service public class MemberService { private final MemberRepository memberRepository; private final ModelMapper modelMapper; public MemberService(MemberRepository memberRepository, ModelMapper modelMapper) { this.memberRepository = memberRepository; this.modelMapper = modelMapper; } /** * 모든 회원을 조회한다. * * @param pageable : 페이징 정보 * @return 모든 회원 */ public Page<MemberResponseData> getMembers(Pageable pageable) { return memberRepository.findAll(pageable).map(Member::fromEntity); } }
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
service 메소드를 public으로 가져오면 안되는 이유가 있나요?
안녕하세요 영한님! 다름이 아니라 service 메소드를 override할 때 protected로 되어있는 코드를 만들어야 한다고 해주셨는데 그 이유가 뭔지 설명 해주시면 감사하겠습니다. protected로 접근 제어자를 지정하면 같은 패키지 이거나 다른 패키지라도 상속관계라면 해당 메소드에 접근이 가능할텐데 혹여 public으로 지정했을때 다른 패키지에 존재하는 클래스에서 해당 메소드를 override 할 수 있는 가능성을 없애기 위해서 인가요? 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원가입 제출 이후 whiteLabel
안녕하세요 강사님. 강의 보며 많이 배우고 있습니다. 강의 내용대로 쭉 따라가며 진행하고 있는데 회원가입 부분에서 회원가입 제출 누르면 홈으로 리다이렉트가 안되고 403에러와 화이트라벨 페이지로 이동하게 됩니다. create 메서드에 로그를 찍어도 안찍히는걸 보니 해당 post 매핑이 잘못되었나 하여 준비해주신 자료에 있는 소스를 복사해 똑같이 붙여넣기해도 마찬가지네요... 혹시 원인이 무엇일까요..ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
궁금한점이 있어서 질문드립니다.
안녕하세요 강의 잘 보고 있습니다, 영상을 3번 들어도 이해가 조금 안되는 문제가 있습니다. 영상 18:20쪽에 보시면 생성자에서 MemberRepository , DisconuntPolicy 타입으로 스프링 빈 저장소에서는 -> memoryMemberRepository 와 rateDiscountPolicy 을 가지고 와서 주입시킨다라고 이해를 하였습니다. 그런데 궁금한점은 AutoAppConfig에서 AppConfig 를 필터를 걸어서 제외를 시켰는데, 어떤방식으로 스프링 빈 저장소에서 rateDisCountPolicy하고 memoryMemberRepository 를 주입시켰는지 궁금합니다.. 간단하게 말씀드리자면 AppConfig 에선 Bean등록 한건 제외시킨걸로 이해를 하였는데.. Appconfig도 실행이 되는거 같아서 질문드립니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
통합 컨트롤러에서 핸들러의 기준은 컨트롤러인가요? 메서드인가요?
안녕하세요. 먼저 좋은 강의 감사합니다. MVC 패턴을 구현할 때에는 handlerMapping 정보에 key로 URL과 value로 controller 객체를 담고 실행했는데요. 통합된 컨트롤러를 하게되면 URL 정보가 메서드마다 매핑되는데 handler Mapping에 controller를 handler로 담고 있다면 어떻게 해당 메서드를 찾는지 궁금합니다. 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
의존성 외부주입 관련 질문입니다!.
안녕하세요!. 강의 막바지에 해당 프론트 컨트롤러에 등록되는 핸들러 매핑 맵과, 핸들러어댑터 콜렉션에 대해서 외부에서 주입하도록 해봐도 된다고 하셨는데, 스프링을 사용할때는 @Configuration과 @Bean 애노테이션을 사용해 Config 클래스에서 의존성을 입맛에 맞게 주입할 수 있었는데, 지금과 같이 스프링을 안쓰고 주입을 하려면 어떻게 해야 할지 키워드가 있을까요? 프로젝트 구동시 어느 시점에서 서블릿이 스캔되서 등록되는지 몰라서 어디에 해당 정보들을 setter든 생성자든 주입해야할지 모르겠습니다 ㅠ
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원가입 시 비밀번호 입력에 대한 질문
안녕하세요 영한님 질문이 있습니다. 회원가입을 할 때 비밀번호를 입력하는 예제를 만들어 보려고 합니다. 회원가입 시에 비밀번호를 입력하고 비밀번호 확인을 입력하여 둘이 같으면 회원가입을 요청하도록 로직을 짜려고 하는데, 이 로직을 어느 계층에 넣어야 할지 고민이 됩니다. 비밀번호 확인이라는 칼럼을 멤버 클래스에 추가하지 않고 클라이언트에서 넘겨준 데이터를 확인만 하고 버리려고 하는데 그러면 MemberApiController에서 직접 처리를 해야하는 걸까요? 감사합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
th:onclick에서 굳이 @{경로} 쓰는 이유가?
안녕하세요? 영한님. 오랜만에 올립니다. resources/templates/basic/addForm.html 에서, [취소] button 부분: th:onclick="|location.href='@{/basic/items}'|" 경로에 @{..} 쓰지 않고, th:onclick="|location.href='/basic/items'|" 로 써도 나중에 소스 보기하면 둘 다 똑 같이 보입니다. 이렇게요, onclick="location.href='/basic/items'" 그렇다면, 굳이 @{..} 를 쓰지 않아도 되는 것 아닐까요? 강의 중에 이미 말씀하신 건지 모르겠지만, 질문 올립니다. (Spring MVC 강의 질문이 너무 없어서 채워 드리려 적는 것, 아닙니다.^^)
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Optional.ofNullable
"회원 도메인과 리포지토리 만들기" 중 findById를 구현하실때 Null값 때문에 Optional.ofNullable 을 쓰셨다고 하셨는데 그냥 if문을 써서 Null이 아닐때 id를 return하고 아닐때 Null을 return하는 방식의 구현을 하면 안되는 건가요? 코드가 좀 더 지저분해져서 그런건가요? 제가 java 쪽은 아직 study를 하지 않아서 질문 설명에 조금 부족한 부분이 있네요.