묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 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를 하지 않아서 질문 설명에 조금 부족한 부분이 있네요.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
model 내용을 request로 옮기는 시점
안녕하세요 영한님! 현재 강의에선 model 오브젝트의 내용을 request 임시 저장소에 옮기는 작업을 MyView에서 하셨는데요. 이렇게 되면 render()도 오버로딩해야되고 파라미터도 (model, request, response)로 개인적으론 지저분(?)하다고 느껴져서 그냥 front controller에서 model 내용을 request로 옮기는 것이 기존 render(request, response) 그대로 사용할 수 있고 좋은 거 같습니다. 제 짧은 소견으론 아키텍처 관점에서도 크게 나쁘진 않은거 같은데 영한님은 어떻게 생각하시는지 궁금합니다.
-
미해결실전! 스프링 데이터 JPA
스냅샷이란..?
선생님 강의 정말 잘 듣고있습니다!! 선생님이 QueryHint에서 readOnly를 켜주면 " 스냅샷을 안찍죠 . . . " 이러셨는데 이떄 스냅샷이 JPA 영속성컨텍스트(1차캐시) 를 의미하는 건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
멤버 서비스 통합 테스트 @Transactional 어노테이션 추가 시 문제
스프링의 통합 테스트 시 JDBC {Api/Template}을 사용하던지 간에 java.lang.IllegalStateException: java.sql.SQLException: Connection is closed 에러가 납니다. 제가 조금 디버깅 해 본 결과 @Transactional 어노테이션이 문제입니다. 혹시나 해서 h2도 소켓 통신 서버 모드로 작동하는 것을 확인하였습니다. 혹시 스프링이나 JDBC 드라이버의 버전 문제인가요? 제가 사용하고 있는 dependencies는 다음과 같습니다.
-
미해결스프링 데이터 JPA
JPA, Hibernate, Spring Data JPA 의 차이점에 헤깔려서 질문올립니다!!
제가 이해한게 맞는지 여쭤보고 싶어서 질문을 남깁니다!! JPA 는 EntityManager 로 ORM 구현 Hibernate는 SessionFactory로 ORM 구현 Spring Data Jpa는 Repository에 JpaRepository를 상속받고 엔티티 객체를 구현하여 ORM 구현 JPA를 사용하지만 구현체인 hibernate를 사용하지 않아도 되고 즉 EntityManager로도 충분히 가능함 이 차이점이 맞나요?? Spring Data Jpa를 사용하지 않고 그냥 JPA만 사용할 경우에도 라이브러리를 spring-data-jpa 를 사용하는건가요??
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요! 서버 프레임워크에 관련해 질문이 있습니다.
4분 30여초 부분에서 서블릿 없이 자바 코드를 실행하는 서버 프레임워크가 있다고 해주셔서 궁금한 마음에 어떤 프레임워크들이 있나 검색을 해봤습니다만 검색에 걸리는것들이 별로 없네요. 혹시 어떤 서버 프레임워크들이 있는지 알려주실 수 있으실까요? 감사합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
질문있습니다.
안녕하세요! 쭉 공부하다보니 강의에서는 지금은 혼자서 개발하고 있는 것이니 백엔드 개발자(나)가 html,js,css 파일을 만들고 html을 타임리프 문법으로 수정해서 화면을 개발하고 있는 것 같다는 느낌이 들었습니다. 그런데 만약 프론트분과 함께 일할 때는 어떻게 하는걸까? 라는 생각이 들어서 질문을 하게 되었습니다! 제가 상상의 나래를 펼친 바로는 상상 1 1. 프론트분이 만든 html,css, js 등을 받아서 백엔드(나) 개발자가 만든 프로젝트의 templates과 static에 넣는다. 2. 백엔드(나)는 model로 넘긴 값들을 바탕으로 프론트분이 만들어준 html파일을 타임리프 문법으로 수정한다. 상상2 1. 프론트분이 만든 html,css, js 등을 받아서 백엔드(나) 개발자가 만든 프로젝트의 templates과 static에 넣는다. 2. 백엔드(나)는 로직에 따라 필요한 값들을 model에 담아 넘긴다. 3. 프론트 분이 model에 담긴 값을 바탕으로 타임리프가 아닌 다른 것을 사용해 화면을 구성한다. 상상 3 1. 설계한 URI에 요청이 들어오면 백엔드(나)는 필요한 데이터를 dto에 담아서 restApi JSON 형식으로 return 시킨다. 2. 프론트분은 받은 JSON형식의 데이터를 바탕으로 화면을 구성한다. 3. 완성한 html,css,js 등의 파일을 templates와 static에 가져온다. 4. 이 방법이 맞다면 프론트분과 일할 때는 model을 사용할 일이 없는것인가..? 제가 한참 고민하다가 상상을 해봤습니다. 프론트분과 어떻게 협업하는 것인가요..?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
IPv4 변경 방법
IPv6이 아닌 IPv4 정보를 보고 싶어서 VM option 추가하려고 했는데 방법을 잘 모르겠네요ㅠㅠ build.gradle 파일에 apply plugin: 'application' applicationDefaultJvmArgs = ["-Djava.net.preferIPv4Stack=true"] 를 추가하고 gradle project refresh를 해주었는데 여전히 IPv6 주소가 뜹니다. 혹시 VM option을 추가하는 다른 방법이 있을까요? 톰캣에는 종종 추가했었는데 내장 톰캣은 어떻게 설정해야하는지 모르겠어요 ㅠㅠ
-
미해결
h2-db properties에서 연결 후에 gradle 재 build 후의 오류
김영한 강사님 강의 [스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 순서 JDBC 강의에서 h2를 application.properties까지 등록하고 gradle을 다시 build 했을 때 아래의 오류가 뜹니다 ㅠㅠㅠ
-
해결됨실전! 스프링 데이터 JPA
@Transaction에 대한 궁금중
안녕하세요 영한님. 강의를 들으면서 문득 @Transaction의 위치와 중첩에 대해서 궁금중이 들어서 제 나름대로 몇가지 테스트를 해봤습니다. 첫 번째로, 리포지토리 레이어에 트랜잭션이 적용되어 있고 해당 리포지토리의 메서드를 사용하는 서비스 레이어에도 트랜잭션이 적용되어 있다면 flush는 두 레이어 중 어느 시점에 발생할까 궁금했습니다. 그래서 테스트를 해본 결과 최종적으로 서비스 레이어의 트랜잭션이 끝나는 순간에 모든 쿼리가 적용되는 것을 볼 수 있었습니다. 두 번째로, 위와 동일한 상황에 서비스 레이어의 트랜잭션 옵션만 readOnly라면 리포지토리의 save 메서드는 실제 db에 저장을 할까 궁금해서 테스트해봤습니다. 결과는 물론 서비스 레이어 트랜잭션이 우선이기에 insert 쿼리는 발생하지 않았습니다. 두 테스트를 통해서 트랜잭션 우선권은 좀 더 넓은 범위(?), 즉 요청과 응답에 가까운 레이어의 트랜잭션을 따라간다고 이해가 됩니다. 그렇다면 제 생각에는 컨트롤러에 트랜잭션을 적용한다면, OSIV를 사용하지 않아도 영속성 컨텍스트가 화면을 띄울 때까지 유지될 것 같은데 막상 해보면 no Session 에러를 뿜내요.. 컨트롤러에서 html 파일을 렌더링해서 반환하는게 아니라 컨트롤러에서 정적 파일로 일단 반환하고 트랜잭션이 종료된 후에 따로 렌더링하는 작업을 거쳐서 그런걸까요? 쓰다보니 말이 길어져서.. 죄송합니다 ㅎㅎ..