묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
@autowired 필드명, @qualifier 강의에서 OCP를 위반하는 것이 아닌지에 대해 질문이 있습니다
안녕하세요. 좋은 강의 감사드립니다. 다름이 아니라 @Autowired 필드명, @Qualifier, @Primary 강의에서 조회 된 빈이 2개 이상일 때 @Autowired 필드명 이나 @Qualifier, @Primary 등을 사용하여 해결한다고 배웠습니다. 궁금한 점을 먼저 써보면, 위와 같은 해결 방법을 사용 시에 기존 구현체 클래스에 직접적인 수정이 일어나는 것에 대해서 1.OCP를 위반하게 되는 것일까요? 2.만약 위반이 아니라면 왜 위반이 아닌지 궁금합니다. 3.위반이라면 또 다른 해결책이 있는지 궁금합니다. 자세한 상황은 이렇습니다. 강의에서 OrderServiceImpl.class 에서 생성자 주입을 통해 discountPolicy에 두 개의 빈이 찾아져버리므로, 특정 빈을 찾을 수 있도록 인자의 파라미터 이름을 수정해야했습니다. (@Autowired 필드명 방식) @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } <OrderServiceImpl.class 수정 전> @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = rateDiscountPolicy; } <OrderServiceImpl.class 수정 후> 이것이 개방-폐쇠 원칙을 못지킨 것이 아닌가 하는 의문이 들었습니다. 이전에 같은 문제로 Component Scan 을 사용하지 않고 AppConfig.class에서 직접 수동으로 Bean을 생성하여 등록하는 과정에선 겹치는 빈이 있을 경우 AppConfig.class 내에서 해결 할 수 있었습니다.. 코드로 보자면 다음과 같습니다. (애초에 수동으로 빈을 등록하므로 애초에 두 개의 빈이 올라오지 않도록 빈을 안올려도 되며, 만약 두 개의 빈을 둘 다 올린다해도 아래와 같이 작성하면 의존성 주입 시 두 개의 빈 찾아져 오류가 생기는 일은 없을 것 같다고 생각합니다.) @Bean public DiscountPolicy discountPolicy() { //return new FixDiscountPolicy(); return new RateDiscountPolicy(); } 하지만 Component Scan, Component, Autowired를 사용할 땐 AppConfig.class에서 하던 것처럼 할 수는 없고, 직접 Impl 클래스에 변경을 해야하거나 @Quilifier 혹은 @Primary 어노테이션을 붙이기 위해 구현체의 클래스를 찾아가서 수정해줘야하는 것 같습니다. 바로 이 부분에 대해서, OCP를 위반하는 것인지 궁금합니다. 또한 만약 위반이 아니라면 왜 위반이 아닌지, 위반이라면 또 다른 해결책이 있는지 궁금합니다. 항상 좋은 강의, 명쾌한 강의, 속이 시원한 강의 해주셔서 너무나 감사드립니다. 강의 들으면서 속이 정말 뻥 뚫리는 느낌을 많이 받았습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요, EntityManager에 대해 궁금한 점이 있어 질문 남깁니다.
JPA 기본편 강의와 같이 듣고 있습니다. 좋은 강의 항상 감사드립니다. (질문 도중 제가 잘못 이해 하고 있는 부분이 있다면 말씀주시기 바랍니다.) 다름 아니라 EntityManager는 요청이 들어올 때 생성되어 사용됬다가 해당 요청이 마무리 되면 삭제된다고 이해 하고 있습니다. 근데 @Repository를 DI를 통해 생성할 때 @RequiredArgsConstructor 를 통해 EntityManager도 생성해줍니다. 그럼 이 EntityManager 인스턴스는 @RequiredArgsConstructor 위 어노테이션으로 인해 필요할 때 마다 그 때 그 때 생성된다고 볼 수 있을까요? 아니면 싱글톤 객체 안에 필드임으로 그 때 그 때 새로운 값을 할당 받는건가요? 감사합니다, 좋은 하루 되세요~
-
미해결스프링 핵심 원리 - 기본편
@ComponentScan 시 Singleton방식
안녕하세요! 강사님 다름이아니라 라이브코딩 도중 의문점이 생겨서 질문 남겨봅니다! 번거로우실텐데 죄송합니다 질문1. 강의에서 본것처럼 AppConfig.class 에서 @Configuration 이 붙지않으면 스프링 컨테이너가 스프링빈들을 전부 싱글톤 방식이 아닌 계속 인스턴스생성을하여 메모리 낭비가 되는 모습까지는 이해했습니다. 근데, AutoAppConfig.class에서 @ComponentScan 시에 @Configuration 애노테이션을 안붙여도 모든 Component들이 스캔 후 알아서 싱글톤방식으로 빈이 생성되는것을 test코드를 통해 확인했습니다! AutoAppConfig에서 컴포넌트 스캔 자체가 AppConfig같은 설정정보 없이도 @Component만을 탐색해서 빈을 등록하는거까지는 이해하고는 있는데 왜 @Configuration 애노테이션을 안붙여도 자동적으로 싱글톤방식으로 빈이 생성되는지 궁금합니다! 제가 뭘 놓치고 있는걸까요???
-
미해결실전! 스프링 데이터 JPA
dto 에 대해서 질문 드립니다.
안녕하세요? 강사님. 항상 강의 잘듣고 있습니다. 다름이 아니라, 이전에 알려주신 내용에서 밑에 처럼 dto로 조회 할때는 new 오퍼레이션을 사용하셨는데, @Query("select new study.datajpa.repository.MemberDto(m.id, m.username, t.name) " + "from Member m join m.team t")List<MemberDto> findMemberDto(); 왜 밑(네이티브 쿼리)에서는 dto 를 조회 할때 new 오퍼레이션을 사용을 안하셨나요..? @Query(value = "SELECT m.member_id as id, m.username, t.name as teamName " + "FROM member m left join team t", countQuery = "SELECT count(*) from member", nativeQuery = true)Page<MemberProjection> findByNativeProjection(Pageable pageable); 항상 좋은 강의와 답변 감사드립니다!!^^
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JPA update
안녕하세요 . 일부 field 에 대한 update를 할때, 기존 entity의 모든 field를 꼭 불러와서 update를 해야하나요? 감사합니다 !!
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JDBC 순수 구현 import 오류
회원 리포지토리 코드를 복사했는데 import org.springframework.jdbc.datasource.DataSourtceUtis; 가 안됩니다. 어떻게 해결해야 하나요? 위의 사진처럼 오류가 생깁니다!!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
국내 대형 IT 기업들이 spring framework를 사용하는 이유를 알고 싶습니다
안녕하세요 김영한님! 자바 백엔드 개발자 지망생입니다. 자바 백엔드 개발자 지망생으로서, 국내의 IT 기업들이 왜 다른 framework들보다는 spring을 이용하는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
generated 폴더 자동 생성이 됩니다.
PDF 파일에서 IntelliJ Gradle 대신에 자바 직접 실행 항목에 적힌 설명처럼 IntelliJ IDEA 변경하고 프로그램 실행시에 /src/main 하위에 generated 폴더가 자동으로 생기는데 왜 생기는건가요?? 안 생기게 못하나요?? 환경 스프링 부트 2.4.2 인텔리제이 얼티메이트 2020.3.1
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
REST API에 대한 질문이 있습니다
안녕하세요? 아직까지는 예제에서 데이터를 직접 리턴해주는 방식으로 하고있는데요, 여기서 로이 필딩이 말하는 Restful의 조건을 만족하려면 Self-Descriptive Messages와 HATEOAS를 만족해야 한다고 하는데 이 조건을들 만족하려면 결국 HttpEntity를 사용하여야 하는걸까요? RestTemplate로 작성된 코드를 보고 영한님의 HTTP 강의도 듣고나니 머릿속에서 퍼즐이 맞춰지는 느낌은 드는데 이게 맞는거다 라는 확신은 없어서 제가 제대로 이해하면서 진행하고 있는건지 궁금하여 질문드립니다. 그리고 강의 만족도가 매우 높습니다 ^^ 항상 감사하게 수강하고있습니다. 이대로 QueryDSL까지 열심히 달려서 실무에서 빨리 적용해보고 싶네요 ㅎㅎㅎ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
뜬금없지만 시간타입에 대해 질문이 있습니다
안녕하세요? JPA에서 시간에 대해 매핑할때 제타위키에서는 Timestamp를 쓰라고 되어있는데 저는 자바8부터는 LocalDateTime을 사용하는걸 권장한다고 배웠거든요. 실제로 직접 매핑해보니 둘다 되긴되던데 영한님은 어떤 타입을 주로 추천하시는지 궁금합니다 !
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
어노테이션 관련 질문드립니다.
7분 즘에 MemberRepository 클래스르 만들고 @PersistenceContext 어노테이션을 private EntityManager em; 에 붙였는데 원래 정석대로라면 팩토리를 만들고 그걸로 엔티티매니저를 반환받는거였는데 이 어노테이션으로 그 과정을 스킵한다고 봐도 되나요? 팩토리 만들 때 마다 비용이 많이 소모된다고 알고있는데 이 어노테이션도 똑같이 팩토리를 한번만 만들고 그 팩토리로 엔티티매니저를 반환하나요? 그렇다면 이 과정을 알고 있다는 전제 하에 그냥 간단하게 @Autowired 같은 거라고 보면 될까요 ㅎㅎ...
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문은 아닙니다만 devtools 동작이 안되는 경우
아무리 devtools 를 적용시켜봐도 리컴파일을 하고 새로고침을 해도 페이지 변하지 않길래 구글님에게 수소문 해본 결과 https://lejewk.github.io/springboot-devtool/ 이거대로 해보니 되네요. 혹시나 devtools 동작 안하시는 분들 참고하시라고 공유차원에서 올려봤습니다~
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
DataSourceUtils import가 안 됩니다..
private void close(Connection conn) throws SQLException{ DataSourceUtils.releaseConnection(conn, dataSource);} 2.4.2 버전을 사용하고 있습니다. JdbcMemberRepository 클래스에서 DataSourceUtils에 관한 import가 되질 않아 진행이 안되는데요. Alt + Enter를 눌러도 추천하는 내용에는 import 내용이 없습니다. 어떻게 해결해야 하나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
fetchJoin 문의드립니다.
영한 스승님 안녕하세요!본 강의에서 작성하신 querydsl 코드에서요. 궁금한 점이 있습니다! fetchJoin 메서드 호출 없이 join 메서드만 호출할 경우' 주문 엔티티'가 가지고 있는 '멤버 엔티티'를 가져오기 위해 추가적인 쿼리가 호출되지 않을까요? 불필요하게 select 쿼리 내 join 절이 붙어서 나가는 것이 아닌가 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Bootstrap을 직접 다운받지않고 CDN을 이용해 간편하게 적용하는 법입니당.
`resources/templates/fragments/header.html`의 코드를 아래와 같이 변경해주시면 됩니다. `<!-- Bootstrap CDN -->`아래 코드 4줄이 Bootstrap을 적용시켜주는 코드입니다. <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head th:fragment="header"> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink- to-fit=no"> <!-- Custom styles for this template --> <link href="/css/jumbotron-narrow.css" rel="stylesheet"> <!-- Bootstrap CDN --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> <title>Hello, world!</title> </head>
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Builder 사용 시 NullPointerException 뜨는 경우 참고사항 (NPE)
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)private List<OrderItem> orderItems = new ArrayList<>(); 이런 식으로 코드를 작성 후 Lombok의 @Builder를 사용하시는 분들은 빌더 패턴을 통해서는 필드에 아무리 기본값을 명시해뒀더라도 기본값이 null아니면 0이 튀어나오므로 @Builder.Default 를 따로 선언해주셔야 null이 아닌 ArrayList가 생성됩니다. @Builder.Default@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)private List<OrderItem> orderItems = new ArrayList<>();
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
batch insert 질문있습니다!
안녕하세요 주니어입니다! 이 강의랑은 동떨어진 질문이긴한데요 ㅎㅎ; 강의보면서 계속 이거저거 생각하다보니 영한님은 혹시 batch insert하실때 어떻게 하시는지 궁금합니다 ! 회사에서는 JPA를 쓸때 기본키 전략이 IDENTITY이면 JPA로 batch insert하기가 어려워서 jdbcTemplate으로 한다고 하거든요. 수량은 대략 5,000~10,000건 단위이고요. JPA초고수께서는 어떤방식으로 batch insert를 하시는지 갑자기 너무너무너무 궁금해져서 동떨어진 질문을 달게됐습니다.. 아 그리고 강의보면서 항상 감사드리고있어요. 제 마음속의 스승님이십니다 !
-
해결됨스프링 기반 REST API 개발
Controller 코드 관련 질문입니다.
좋은 강의 감사드립니다. 한국은 설 연휴가 시작되었는데 새해 복많이 받으세요! 10분40초경 return 해줄 때 ResponseEntity의 body에 event가 아니라 newEvent를 반환해줘야 될 것 같은데 아닌가요..? 현재 코드상 event 는 modelmapper를 활용해서 만든 event객체라 id값이 없고 테스트를 실패할것 같은데 body에 event를 넘겨줘도 테스트에서 return 된 body 에는 id값이 들어가있고 테스트가 통과되는데 제가 놓친부분이 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
orderId 가 1000개가 넘어가는 경우에 대해 궁금합니다.
영한님 안녕하세요!orderId 가 1000개가 넘어가는 경우에 대해 궁금합니다.Mysql 기준 where in절에 올 수 있는 최대 개수가 1000개로 알고 있어서요. 이 경우 애플리케이션 코드에서 1000개를 파티션하고 나눠서 호출하는게 맞을까요?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
rest api + 관리자 페이지 제작 및 oauth 관련하여 질문드립니다.
안녕하세요. 현재 모바일 앱 연동을 위해 bearer 인증 기반으로 rest api 서버를 구축하였습니다. 회원가입은 firebase 의 id_token 인증을 통해 진행됩니다. 여기서 관리자페이지 제작을 하려고 하는데 보통 관리자 페이지는 api서버 프로젝트와 따로 프로젝트를 생성하여 만드는지 아니면 한 프로젝트에 모든 기능을 한 번에 구축하는지 일반적으로 현업에서는 어떤 구조로 이루어져있는지 궁금합니다. 프로젝트를 따로 가져가는 경우 공통된는 service 기능이나 domain은 중복해서 생성해야할거같아서 비효율적일거 같아 우선 저의경우 한 프로젝트에 앱 서버와 관리자 서버 모두 구축하는 방법을 진행해 봤는데 rest api 기반 시큐리티 설정과 웹 시큐리티 설정이 동시에 구축되는게 문제가 있는지 웹 로그인이 진행이 안됩니다. 다른 질문으론 oAuth2가 스프링에서 deprecated 된거같은데 선생님께서는 다른 방안을 어떻게 생각하고 계신가요?? 답변 부탁드립니다. 감사합니다!