묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
ComponentScan시 @Configuration
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]수동으로 빈을 등록할 때 AppConfig 클래스에 붙은 @Configuration이 빈의 싱글톤을 보장한다면, 컴포넌트 스캔으로 빈을 등록할 때 AutoAppConfig에 붙은 @Configuration은 AutoApppConfig 클래스를 스캔 범위로 포함시키는 것 외에 무슨 역할을 하나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
예외 처리 부분에 대해서 질문드립니다
안녕하세요. 좋은 강의 잘 듣고 있습니다.다름이 아니라 예외처리에 대해서 질문드립니다.MemberService2 코드를 보면 예외를 처리하는 부분에 있어서 ,try~catch로 예외를 처리하는데 catch에는 단순히 로그만 찍거나 try~catch로 예외를 처리하는데 catch에서 throw로 예외를 발생시키고,어떤부분은 단순히 throws로 예외를 넘기는데, 어떤기준에 의해서 이렇게 하셨는지 궁금합니다.. 혹시 강의 뒤편에 있는 예외처리부분을 학습하면 해결이 되는 부분일까요..? 트랜잭션에 관련된 부분은 이해가 되었는데 이 부분이 애매해서 질문드립니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
DeferredImportSelector와 Condition
안녕하세요.조건부 자동구성 강의를 보면서 Spring은 사용자가 직접 구성한 Configuration클래스가 전부 로딩이 되고난 후, 자동 구성정보가 적용되도록 만들기 위해 DeferredImportSelector를 구현한다고 이해했습니다.근데 강의 초반의 흐름을 생각해보니, Spring이 초기화되는 타이밍에 ServletContainer에 dispatcher가 등록되면서 시작하고 그다음에 메인클래스가 register되고 이때 메인은 ComponentScan을 메타로 달고있기에 이 시점에 컴포넌트들이 읽히면서 등록되는구나 싶엇는데.. 이 부분이 헷갈리네요.분명 위의 흐름대로라면 자동 구성영역이 먼저 등록됐기 때문에 Tomcat도 getBean할 수 있었을텐데..spring은 미리 뭐 클래스영역에 있는 메타정보로 자동구성을 대체할 수 있는 빈이 있는지를 먼저 볼수있고 지나칠수있는.. 그런걸까요..? 궁금합니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
controller가 널일수도 있으니까 Optional로 감쌀 수는 없나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.ifPresentOrElse()같은 걸 사용할 수는 없는지 여쭤봅니다.
-
미해결스프링 핵심 원리 - 기본편
다형성, OCP, DIP의 차이점
[질문 내용]다형성 : 하나의 타입으로 여러개의 객체를 다룰 수 있는 것OCP : 변경에는 닫혀있고, 확장엔 열려있는것 따라서 클라이언트 기존의 코드는 변경하지 않고 확장을 통해 기능을 추가하고 변경할 수 있다DIP : 클라이언트와 구현체는 추상화에 의존해야된다는 것 따라서 클라이언트가 구현 객체에 의존하는 것이 아닌 클라이언트와 구현객체 사이에 인터페이스를 두고 클라이언트와 구현객체가 인터페이스에 의존하여 구현객체를 변경해도 클라이언트에 영향이 없음을 의미한다전 아무리 생각해도 다형성, OCP, DIP 이 세가지가 결국엔 추상화에 의존해서 클라이언트의 코드 변경없이 기능을 확장시킨다를 의미하고 있고, 다형성, OCP, DIP 이 세가지가 말만다르지 다 똑같아 보이는데 ,,명확한 차이점이 있을까요? 그리고 예를들어 OCP를 위반해도 DIP는 지켜지는 그런 상황도 있을까요?
-
해결됨토비의 스프링 6 - 이해와 원리
안녕하세요 jdk 질문드려요
안녕하세요! 토비님 같은 버전의 jdk에서도 zulu나 강의에서 예시로 다운받으신 liberica와 같이 회사가 다른데 혹시 그들만의 차이점이 있을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
BindingResult는 SSR에서만 쓰이는 방식인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]BindingResult는 ssr 방식에서 사용하는 방식 같은데 맞나요..? csr 방식일 때는 컨트롤러 어드바이스로 예외를 던져주고 그 예외를 웹쪽에서 따로 처리해주는 게 일반적인걸까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
/api/v1/members 버그
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강사님처럼 코드를 다음과 같이 작성했습니다.MemberApiController.javapackage jpabook.jpashop.api; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import jpabook.jpashop.domain.Member; import jpabook.jpashop.service.MemberService; import lombok.AllArgsConstructor; import lombok.Data; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; @RestController @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; @GetMapping("/api/v1/members") public List<Member> membersV1() { return memberService.findMembers(); } @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); Long joinedMemberId = memberService.join(member); return new CreateMemberResponse(joinedMemberId); } @PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2(@PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { Member member = new Member(); member.setName(request.getName()); memberService.update(id, request.getName()); return new UpdateMemberResponse(id, request.getName()); } @Data static class CreateMemberRequest { @NotEmpty private String name; } @Data @AllArgsConstructor static class CreateMemberResponse { private final Long id; } @Data static class UpdateMemberRequest { @NotEmpty private String name; } @Data @AllArgsConstructor static class UpdateMemberResponse { private Long id; private String name; } } MemberService.javapackage jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class MemberService { private final MemberRepository memberRepository; /* * 회원 가입 * */ @Transactional public Long join(Member member) { validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(member); return member.getId(); } /* * 중복 확인 메서드 * */ private void validateDuplicateMember(Member member) { List<Member> findMembers = memberRepository.findByName(member.getName()); if (!findMembers.isEmpty()) { throw new IllegalStateException("이미 존재하는 회원입니다."); } } // 회원 전체 조회 public List<Member> findMembers() { return memberRepository.findAll(); } public Member findOne(Long memberId) { return memberRepository.findOne(memberId); } @Transactional public void update(Long id, String name) { Member member = memberRepository.findOne(id); member.setName(name); // 영속성 컨텍스트에서 엔티티를 수정하면 트랜잭션 커밋 시점에 변경 감지(Dirty Checking)가 동작한다. } } MemberRepository.javapackage jpabook.jpashop.repository; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jpabook.jpashop.domain.Member; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; // 컴포넌트 스캔에 의해 // 스프링 빈에 자동으로 등록 @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member) { em.persist(member); } public Member findOne(Long id) { return em.find(Member.class, id); } public List<Member> findAll() { return em.createQuery("select m from Member m", Member.class) .getResultList(); } public List<Member> findByName(String name) { return em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name", name) .getResultList(); } } Member.javapackage jpabook.jpashop.domain; import jakarta.persistence.*; import jakarta.validation.constraints.NotEmpty; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); } 그리고 postman으로 localhost:8080/api/v1/members로 호출을 하게 되면 다음과 같이 무지막지하게 많은 양의 결과가 나옵니다. 왜 그러는 걸까요?
-
미해결토비의 스프링 6 - 이해와 원리
개발환경 세팅에서 질문있어요.
안녕하세요. 토비님.좋은 강의 만들어주셔서 감사합니다.질문이 하나 있습니다.개발환경 세팅에서 bash 명령어를 추천해주는 툴? 플러그인을 사용하고 있는것으로 보이는데요.무엇인지 알려주시면 좋겠습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
build.gradle 에러
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]build.gradle에서 에러가 발생합니다 자바 버전 17 사용했습니다Could not apply requested plugin [id: 'io.spring.dependency-management', version: '1.1.5'] as it does not provide a plugin with id 'io.spring.dependency-management'. This is caused by an incorrect plugin implementation. Please contact the plugin author(s).> Plugin with id 'io.spring.dependency-management' not found.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 코드 연결하는데 데베에 문제가 있다고 하네요
Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:143) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]이런식의 오류가 났는데 데베설정이 잘못돼서 그런건가요 코듣상의 문제는 없는거 같습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
홈화면 추가에서 index.html이 실행되고 home이 실행이 안되는 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 강의 보고 똑같이 코딩했는데localhost:8080이렇게넣었을때 welcom화면으로 index.html이 뜹니다다른분들이질문하신 글들을 다 읽어보고 답변해주신내용들 대로 다 실행해보았으나 해결이 되지 않아, 같은 내용이지만 글을 올립니다..home에서 ctrl + B했을때 home.html화면이 잘 떴었고,전체기간 캐시도 삭제해 봤습니다..그리고 index.html지우면 화이트라벨 에러뜨면서 안되더라구요.제거https://drive.google.com/file/d/1mDv9-Z_r6aChpDBx1ZhtlJZL0dZG6Hzj/view?usp=sharing
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
첫 프로젝트 생성 문의
프로젝트 생성해서 자바 17버전을 깔고 다시 나갔다 들어오니 처음 화면이 저렇게 나옵니다 우측 선생님과 같은 화면이 안나오는데 어떻게 해야하나요??
-
미해결스프링 핵심 원리 - 기본편
8분 10 초 영상 AutoAppConfigTest
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]8분 10 초에서 AutoAppConfigTest 에서 basicSacan Test 할 때 왜 OrderServiceImpl 생성자가 호출이 되는건가요..? ㅠㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
redirectAttributes 질문
@PostMapping("/login") public String loginV4(@Validated @ModelAttribute LoginForm form, BindingResult bindingResult, // @RequestParam(defaultValue = "/") String redirectURL, RedirectAttributes redirectAttributes, HttpServletRequest request) { if (bindingResult.hasErrors()) { log.info("errors={}", bindingResult); return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); log.info("login? {}", loginMember); if (loginMember == null) { bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); log.info("bindingResult={}", bindingResult); return "login/loginForm"; } //세션이 있으면 있는 세션 반환, 없으면 생성 HttpSession session = request.getSession(); //세션에 로그인 회원 정보 보관 session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); //redirectURL 적용 log.info("request.getParameter={}",request.getParameter("redirectURL")); redirectAttributes.addAttribute("redirectURL", request.getParameter("redirectURL")); return "redirect:{redirectURL}"; }맨 아래에서 강사님과 다르게 @RequestParam을 사용하지 않고 RedirectAttributes와 getParameter를 이용해서 처리를 해 보려 했는데,실행 결과 {redirectURL}의 부분이 'localhost:8080/%2Fitems' 로 뜹니다.redirectAttributes에 넣을 때 잘못된 건가 싶어서 request.getParameter의 로그를 찍어보면 정상적으로 /items로 나옵니다.어디가 잘못 된 건지 여러 번 돌려봐도 모르겠어서 질문 남깁니다! 추가 : URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험하다. 다음에 설명하는 RedirectAttributes 를 사용하자.라고 하셨는데 @RequestParam 으로 받은 변수값을 써도 괜찮은 건지 잘 모르겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
test-resources - application-test.yml로 했을 때 h2에 테이블이 생성되지않아요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의대로 application.yml로 했을 때는 생성이 잘 되었습니다.그런데 test -resource - application-test.yml로 넘어가니h2에 Member테이블이 생성되지 않습니다. 어떻게 해야할까요?
-
미해결스프링 핵심 원리 - 기본편
Order 1분20초 질문
orderApporder학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.order 부분 오류가 났는데 toString연결 부분인데 왜 오류가 난건지 모르겠어요..
-
미해결예제로 배우는 스프링 입문 (개정판)
jar 안되는 분들 참고하세요
java -jar target/spring-petclinic-3.3.0-SNAPSHOT.jar강의에서 처럼 주소 지정이 안찾아지는 분들은 왼쪽 상단바에 jar검색하셔서 해당하는 주소값을 마지막에 적으시면됩니다.왼쪽 파일 검색 jar검색java -jar target/해당하는 파일명.jarex)java -jar target/spring-petclinic-3.3.0-SNAPSHOT.jar
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ide 질문
안녕하세요 이제 막 수업을 따라가려하는데 이클립스, 인텔리제이가 아닌 sts4로 실습을 해도 괜찮은지자바 버전은 11로 알려주셨지만 11이상의 다른 버전으로 해도 무방한지 여쭙고 싶습니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
@ComponentScan과 @SpringBootApplication 관계
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]AutoAppConfig와 같은 설정 클래스를 만들지 않아도 @SpringBootApplication에 @ComponentScan이 있기 때문에, CoreApplication 클래스가 위치한 hello.core가 스캔 시작 범위가 되고, 하위의 모든 패키지에 존재하는 @Component를 인식하여 빈으로 등록하는 건가요?AutoAppConfig와 같은 설정 클래스를 만들지 않아도 @SpringBootApplication의 @ComponentScan에 의해 빈을 등록하지만, AutoAppConfig를 만드는 이유는, ComponentScan 범위를 지정하고, Filter를 사용하기 위함인가요?