묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
외부 라이브러리에 초기화, 종료 메서드를 적용하는 경우에 대한 의문점
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]"코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다."라고 나와 있는데 이게 어떻게 가능한지에 대해 궁금합니다. 아래는 강의에 나온 예인데@Bean(initMethod = "init", destroyMethod = "close") public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); networkClient.setUrl("http://hello-spring.dev"); return networkClient; }이 경우엔 초기화 메서드 init()과 종료 메서드 close() 모두 NetworkClient의 메서드이잖아요? 그런데 외부 라이브러리에 초기화, 종료 메서드를 적용할 땐 초기화 메서드와 종료 메서드를 어떤 클래스에서 선언하고, @Bean(initMethod = ?, destroyMethod = ?) 여기에선 어떤 식으로 적으면 되나요?외부 라이브러리는 코드를 수정할 수 없으니 외부 라이브러리 클래스 내부에 초기화, 종료 메서드를 선언하긴 어려울 것 같아서 질문드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
옵셔널 질문입니다.
회원서비스개발강의에서요.memberRepository.findByname(member.getName())이부분이 4분 5초에는 옵셔널이 있어서 옵셔널이라고 했는데요. 근데 강의에서 옵셔널을 지웠는데도 옵셔널인 이유가 뭔가요?
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
방법2. custom setter 사용하기에 대해 질문
안녕하세요!오랜만에 재수강 중인데 다시보다가 질문이 있어서 남깁니다! 2분41초에서 setter를 private으로 두고 싶은 경우 private set을 이용하기라고 되어 있는데요.JPA와 함께 사용하게 된다면 저는 엔티티 클래스의 경우 gradle 설정에서 OPEN설정을 해주는데, open으로 두게 되면 private set 기능은 사용이 불가능 하더라고요. 이 부분에서 jpa의 프록시 기능 사용이 안 되는 것으로 알고 있는데 TRADE-OFF의 영역인지 아니면 제가 모르는 다른 설정으로 프록시 기능을 사용하면서 private set을 사용할 수 있는지 궁금합니다!.
-
미해결스프링 부트 - 핵심 원리와 활용
자동 구성 라이브러리 사용하기2 관련 질문
[질문 내용]만들어 주신 강의 잘 보고 있습니다.자동 구성 라이브러리 사용하기2 강의 내용 보면project 에서 memory.jar를 자동구성으로 사용합니다.강의 후반부(5:01 ~5:10)에 언급하신것 처럼 jar파일에 자동 구성 설정이 되어야 가능한 것 같은데순수한 jar(Spring 손이 묻어있지 않은) 같은 경우 자동설정은 곤란한걸까요? 그럴 경우 전 강의에서 한것 처럼 project에서 @Configuration 을 이용하여 빈을 전부 등록해서 진행하는게 유일한 방법인지 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
생성자 검증
안녕하세요 우빈님!빌더 패턴 사용 시 생성자 검증을 어떻게 하는 것이 좋을까에 대한 질문을 드리고 싶습니다..!변경 가능성이 있는 도메인 검증을 진행 할 때 빌더 패턴이 적용 된 private 생성자에서 검증을 진행하나요?저 또한 정적 팩토리 메서드를 즐겨썼었는데 Builder를 사용하고나니 어느 위치에서 검증을 하는게 좋을까에 대한 의문이 생기더라구요.기본적으로는 보통 정적 팩토리 메서드에서 생성자 검증을 진행하게 되면 도메인에서 검증을 위한 private 메서드가 전부 static이 되어야하는데 이게 옳은가? 라는 의문이 들기도 하고그렇다고 private한 빌더 쪽에 생성자 검증을 하려고 하니 외부 세계에 영향을 받는 가령 클라이언트로 부터 입력받은 시간이 현재 시간 이전 일 수 없습니다. 라는 테스트를 수행해야 할 때 외부로부터 계속해서 LocalDateTime.now() 를 전파받아서 구현을 해야하는데 이 필드를 생성자에 추가하는 것도 아닌 것 같고..이러한 고민 속에서 결국 생성자에서 진행됐어야 할 검증을 서비스 로직에서 도메인의 검증 메서드를 따로 호출하였는데 서비스 로직에서 검증 메서드를 호출하는 것 또한 좋은 방법은 아닌 것 같다는 생각이 들었습니다.이러한 상황에서 우빈님은 보통 어떤 방식을 택하시는지 궁금합니다 ㅎㅎ
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
김영한 jpa와db설정, 동작확인
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 김영한 선생님의 jpa 활용 1 보는중에 오류가 발생해서 왜 나는 지를 모르겠어서 제 코드 링크 올려드립니다...아무리 찾아봐도 저랑 같은 오류나시는 분은 없네요 .. 도와주시면 감사하겠습니다https://drive.google.com/file/d/18zaQUCmzeezfy0cITdcP45qDgXifPgJf/view?usp=sharing
-
해결됨쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS
.gitignore 에 포함할 파일
gradlew gradlew.batapplication.properties파일들이 깃헙에 올라가도 상관이 없나요?기본적으로 지금 .gitignore에 적혀있는 파일들 제외하고는 다 깃헙에 올라가도 괜찮은걸까요?HELP.md .gradle build/ !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache bin/ !**/src/main/**/bin/ !**/src/test/**/bin/ ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr out/ !**/src/main/**/out/ !**/src/test/**/out/ ### NetBeans ### /nbproject/private/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ ### VS Code ### .vscode/
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
트랜잭션 전파속성, 데이터 소스
안녕하세요. 강의 잘 보고 있습니다. 의문이 생겨 질문을 남깁니다. 트랜잭션 전파속성을 REQUIRES_NEW로 해서 새로 생성한 이유가 있을까요? 그냥 REQUIRED로 하면 안되나요??강의 내에서 데이터소스를 분리하는 것을 추천해주셨는데, 커넥션 풀 사이즈를 늘리면 안되나요?? 감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션은 공유해서 쓰나요?
세션에 관해 궁금한게 있습니다.예를 들어 사용자1이 서버에 접속을 하여 로그인을 하여서버에서는 getSession()이라는 함수를 통해 처음으로 접속한 사람이므로세션을 새로 만듭니다.이후 바로 사용자2이 서버에 접속하면 getSession()은 있는 세션을 그대로 사용,즉 세션 1개로 모든 사용자들이 공유하게 되는건가요?
-
해결됨스프링 핵심 원리 - 기본편
[빈 생명주기 콜백 시작] 초기화에 관련해서 질문이 있습니다.
안녕하세요.영한님이 빈 생명 주기 콜백이란 강의에서 말씀해주신 내용과 관련해서 질문이 있어 연락드립니다.위의 그림을 보시면 객체의 생성과 초기화를 분리하자고 되어 있습니다.제가 이 문구를 이해한 바로는 생성자를 통해서 초기화를 하지 말고 setter함수를 통해서 초기화를 하자는 내용입니다.그러나 이 초기화라는 개념이 모호합니다.초기화의 목적은 객체가 사용가능하도록 만드는 것이라고 알고 있습니다.그런면에서 속성값을 넣어주는 것은 초기화라고 생각합니다.하지만 객체에 의존관계를 주입해주는 것도 구체적인 값을 부여해주는 것이기에 초기화라고 할 수 있습니다.그렇다면 의존관계 주입도 setter로 하는게 좋다는 결론이 됩니다.하지만 영한님의 이전 강의 '생성자 주입을 선택해라!' 편에서 말씀해주셨듯이 의존관계의 경우 생성자 주입을 선택하는 것이 좋다는 말씀하셨습니다.여기에 대해 제가 결론을 내린 바로는 속성값을 넣어주는 것과 의존관계 주입 모두 초기화인데 속성값을 넣어주는 것은 setter를 통해 의존관계 주입은 생성자 주입을 통해 라는 것입니다. 속성값을 setter로 넣어주는 이유는 그값이 변할 수 있기 때문이고 생성자 주입을 사용하는 이유는 보통은 객체가 변할 일이 없기 때문일 것입니다.방금전 제가 내린 초기화에 대한 결론이 맞는지 궁금합니다.감사합니다.
-
해결됨실전! 스프링 데이터 JPA
@Rollback(false) 이 되지 않아요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]'예제 도메인 모델과 동작확인' 테스트 과정에서 @Rollback(false)가 동작하지 않아 h2 데이터베이스에 테이블이 생성되지 않습니다. application.ymlspring: datasouce: url: jdbc:h2:tcp://localhost/~/datajpa username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: format_sql: true logging.level: org.hibernate.SQL: debug # org.hibernate.type: trace MemberTest.java@SpringBootTest @Transactional @Rollback(value = false) class MemberTest { @PersistenceContext EntityManager em; @Test public void testEntity(){ Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); em.flush(); em.clear(); List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList(); for (Member member : members) { System.out.println("member = " + member); System.out.println("member -> " + member.getTeam()); } } }
-
미해결스프링 핵심 원리 - 기본편
싱글톤 테스트
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의에서 싱글톤은 유연하게 테스트가 어렵다고 말씀해 주셨는데요.어려운 이유가 static이기 때문인가요?클래스가 메모리에 로드될 때 생성되는거라서 유연하지 않은건지 궁금합니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
학습 테스트 중 스프링 컨테이너 관련 질문이 있습니다.
우선 강의 정말 잘 보고 있습니다. 토비님.일단 굉장히 초보적인 질문을 드리는 것 같아서 죄송스럽지만 자꾸 뭔가 하나 모자란 느낌이 자꾸 들어서 질문드립니다.계속 강의를 보면서 서블릿 컨테이너를 띄우고 스프링 컨테이너도 띄우고 이 과정을 리팩토링해서 스프링 컨테이너만 띄운 뒤 서블릿 컨테이너와 디스패쳐 서블릿의 팩토리 메소드를 빈으로 바꾸는 과정까지 학습했습니다. 그런데 이번 강의에서 나오는 학습 테스트를 보면 별다른 빈을 등록하지 않으시고 스프링 컨테이너만 띄우셔서 커스텀 빈을 테스트하시는 것 같아 보였습니다. 여기서 궁금한 점이 스프링 컨테이너에 빈이 등록되고 라이프사이클이 끝나는 과정까지 서블릿 컨테이너를 아예 의존하지 않는게 맞나요? 사실 웹 프로덕트 코드를 구현하는 과정에선 반드시 서블릿 컨테이너가 있어야 파싱이 되기 때문에 실무에선 무쓸모일 고민 같지만 스프링 컨테이너가 얼마나 독립적으로 실행될 수 있는지 알면 좋을 것 같아서요...
-
미해결스프링 핵심 원리 - 기본편
강의 로드맵 순서 질문있습니다!
영한님 강의 로드맵을 보고 메모 후 밑의 강의들을 모두 구매한 상태입니다. 1.스프링입문 2.스프링 핵심원리-기본편3.모든 개발자를 위한 http 웹 기본지식 4.스프링 웹 MVC 1,2편5.스프링 DB데이터 접근 기술 1,2편 6.스프링 핵심원리-고급편7.실전! 스프링 부트부트+jpa 현재 2번 스프링 핵심원리- 기본편까진 완강한 상태이고마지막 다음으로 강의에선 기본편 마치고 웹 MVC, DB 접근 기술, 부트까지 가는 방향으로 생각하고 있다고 해주셨는데20년 강의순서 답변과 제가 봤던 로드맵과 마지막 강의에서 추천해주시는게 다 달라서추천해주신대로 바로 다음 스프링 부트와 JPA 실무 완전 정복 로드맵 후에MVC DB로 가면 되는거지학습 순서와 강의 구성을 어떻게 하면 좋을지 여쭙고자 질문 올렸습니다 !
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HTTP 요청 데이터
HTTP 기본 강의에서는 조회성이면 GET 등록이면 POST수정이면 PUT, PATCH 등등 이런식으로 작성하라고 배웠습니다.그런데 여기서 헷갈리는 부분이 있는데요현재 MVC 강의자료에서HTTP 요청 데이터 - API 메시지 바디 - 단순 텍스트HTTP 요청 데이터 - API 메시지 바디 - JSON형식을 사용하는 경우 주로 POST, PUT, PATCH 메서드를 사용한다고 적혀있습니다. 그러면 스프링 컨트롤러를 API 방식으로 설계할 경우 컨트롤러 특성이 조회성 (EX. 12월 거래내역건 조회)이더라도 POST METHOD으로 작성해야하는건가요?아니면 조회성은 GET METHOD로 작성해야하는건가요??올바르게 작성하고 싶은데 너무 궁금하네요.예시 케이스가 있다면 알려주시면 감사하겠습니다
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderResitory 를 주입받는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Controller 코드에서 Service 를 주입받지 않고 Repository 를 주입받는 이유가 있나요 ?MemberApiController 에서는 MemberService 를 주입받았는데 OrderApiController 에서는 OrderRepository 를 주입받는 이유가 궁금합니다!
-
해결됨스프링 핵심 원리 - 기본편
스프링 없이
스프링 없이 순수 자바 코드로 런타임 시점에 dependency injection이 가능하게 구현할 수 있나요??
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
test method에 throws Exception을 붙이는 이유가 궁금합니다.
영한님 강의를 보면 라이브 템플릿으로 test 코드 작성하실때method뒤에 throws Exception이 붙는데 위와 같이 선언하면 해당 메서드가 외부로 Exception 예외를 건내줄 수 있다는 의미 아닌가요??
-
미해결스프링 핵심 원리 - 기본편
현 스프링 스타터 셋팅 항목좀 알려주세요 영상이랑 전혀 달라서 손을 못대고 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]현 스프링 스타터 셋팅 항목좀 알려주세요 영상이랑 전혀 달라서 손을 못대고 있습니다
-
미해결스프링 시큐리티 OAuth2
Naver Login시 권한에 대해 질문이 있습니다
CustomAuthorityMapper 클래스에서강사님과 코드는 동일하나authorities가 넘어올시에 위와 같이 넘어옵니다.그래서 강사님 영상과 다르게ROLE_USER만이 authority에 대해서 담기게 되고위의 사진은 hasRole 권한을 해제하여 찍어본것입니다. /api/user에 진입이 불가합니다 코드는 동일한데 뭐가 문제일까요,,,? 강사님의 네이버 로그인시는 response를 안벗기고도 진입이 가능해서 질문드립니다 package io.security.oauth2.sociallogin; import lombok.RequiredArgsConstructor; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; import java.util.Collection; import java.util.HashSet; import java.util.Set; public class CustomAuthorityMapper implements GrantedAuthoritiesMapper { private String prefix = "ROLE_"; @Override public Set<GrantedAuthority> mapAuthorities(Collection<? extends GrantedAuthority> authorities) { HashSet<GrantedAuthority> mapped = new HashSet<>(authorities.size()); for (GrantedAuthority authority : authorities) { mapped.add(mapAuthority(authority.getAuthority())); } return mapped; } private GrantedAuthority mapAuthority(String name) { if(name.lastIndexOf(".") > 0){ int index = name.lastIndexOf("."); name = "SCOPE_" + name.substring(index+1); } if (!this.prefix.isEmpty() && !name.startsWith(this.prefix)) { name = this.prefix + name; } return new SimpleGrantedAuthority(name); } }