묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강사님 폴더에서는 안보이는데 out 폴더가 보여요
강사님이랑 폴더 구조가 달라요!문제가 있을까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2파일 cmd,git bash에서 열려고 하는데 안됩니다.
H2 데이터베이스 설치 강의 3분 42초부터 안됩니다.일단 저는 최신 스프링 인텔리제이를 설치해 사용중이며자바는 따로 설치하지 않은 상황입니다.19년도 인텔맥에 윈도우10을 설치하여 공부중에 있습니다. cmd와 git bash로 시도중에 있습니다.각각 h2.bat 과 ./h2.sh 를 입력하는데 안되고 있습니다.
-
미해결실전! 스프링 데이터 JPA
entity 복제 방법
안녕하세요!이번에 jpa 엔티티를 복제할 일이 생겼습니다 제가 복제해야 할 엔티티는 자기참조도 하고, 1:n 관계의 조인도 되어있는 복잡한 엔티티 입니다 이런 경우 하나하나 deep copy 를 하려니 양방향 연관관계 등 로직이 너무 복잡해지는 부분이 존재하는 것 같습니다 그래서 찾아보니 entity 복제를 위해 여러가지 방법이 있다는 것을 알게되었습니다 https://www.baeldung.com/java-jpa-clone-entity요약해보면수동 복제 Cloneable 인터페이스 사용 BeanUtils 사용 ModelMapper 사용 detach() 메서드 사용 다양한 방법이 있는 것 같은데 현업에서는 주로 어떤 방식을 사용하나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
포스트맨에서 쿠키삭제에 대한 질문
제일 처음에 쿠키를 발행했습니다.그리고 응답과 헤더에는 쿠키가 남아있는 걸 확인했습니다. 이후, 포스트맨에서 쿠키를 발행하고 setMaxAge(0)을 이용해 없앴습니다.그런데 헤더에는 쿠키의 기록이 계속 저장되어 있는 상태로 유지되었습니다. 이후, 포스트맨을 이용한 쿠키 테스트를 진행하는데 있어서쿠키가 계속 헤더에 남아있는 채로 유지되길래 질문드립니다.(쿠키의 수명을 0으로 만든 이후에도 헤더에 쿠키가 계속 유지되는 사진)setMaxAge(0)을 하면 쿠키가 없어지는 게 정상맞나요?원래 없어져야하는데 포스트맨에서 자동으로 등록해주다보니 이렇게 된건가요?만약 맞다면, 쿠키가 소멸함에따라 헤더에서 쿠키 제거하는 방법이 없을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
모르는 것이 많은데, 이대로 진행해도 괜찮을까요?
안녕하세요. 저는 전공자고, 자바는 학교에서 배운 상태입니다.백엔드 공부하려고 김영한 선생님 로드맵 따라가고 있고, 현재 스프링 입문 강의까지 맞춘 상태입니다.스프링에 처음 접하는데 스프링 입문 강의를 듣고 기능적인 부분은 대충 이해를 하였는데, 문법적인 것들은 처음 접해서 어려움을 느끼고 있습니다. 혹시 스프링에 대해 따로 공부하고 로드맵을 진행해야 할까요? 아니면 따로 스프링 공부 없이 로드맵을 따라가도 괜찮을까요..?
-
미해결Practical Testing: 실용적인 테스트 가이드
정적 팩토리 메서드 사용과 toEntity 메서드에 대해 질문 있습니다.
우선 빌더를 활용해 내부에서 객체를 생성하고 외부에서 해당 객체를 생성하려면 정적 팩토리 메서드를 사용하거나 혹은 toEntity 같은 메서드를 만들어 사용하면 좋을거 같다 라는 생각이 들었습니다. 궁금한 점은 외부에서 객체를 생성할때 어떤 경우에는 정적 팩토리 메서드를 사용해서 생성하고 어떤 경우에는 toEntity 같은 메서드를 만들어서 사용하면 좋을지 궁금합니다.@Getter @NoArgsConstructor public class ProductCreateServiceRequest { private ProductType type; private ProductSellingStatus sellingStatus; private String name; private int price; @Builder private ProductCreateServiceRequest(ProductType type, ProductSellingStatus sellingStatus, String name, int price) { this.type = type; this.sellingStatus = sellingStatus; this.name = name; this.price = price; } public Product toEntity(String nextProductNumber) { return Product.builder() .productNumber(nextProductNumber) .type(type) .sellingStatus(sellingStatus) .name(name) .price(price) .build(); } }
-
미해결스프링 핵심 원리 - 기본편
@Autowired를 제거해도 의존 관계 주입이 가능한지
[질문 내용]질문 1.ComponentScan과 Autowired를 이용한 스프링 빈 등록 과정을 다음과 같이 이해해보았는데 틀린 내용이 있을까요? 특히 2,3,4 과정이 자세히 알고 싶습니다. @Component 애노테이션이 달린 클래스의 이름을 갖는 빈( 빈 껍데기 )을 등록빈으로 등록된 클래스의 생성자를 실행이 때 생성자의 매개변수가 적은 순서대로 실행 ( MemoryMemberRepository,RateDiscountPolicy -> MemberServiceImpl -> OrderServiceImpl )@Autowired 애노테이션이 달려있다면 생성자의 매개변수 클래스 타입을 확인한다. 해당 클래스 타입을 등록되어 있는 스프링 빈에서 가져온다.생성자를 실행하여 의존 관계 주입을 받은 인스턴스를 등록되어 있는 빈에 넣는다. 질문 2 .3~4 과정에서 @Autowired 애노테이션이 없다면 의존 관계 주입이 이루어지지 않을 것이라고 생각해서 MemberServiceImpl에 @Autowired를 제거해보았는데 MemoryMemberRepository 빈을 알아서 가져와서 의존관계 주입을 받게 되는데 어떻게 주입 받는 것인지 궁금합니다. Dependencies Diagram을 확인해보았더니 @Autowired를 통해서 주입 받는 orderServiceImplr과는 다르게 depends on 이라고 적혀있는데 MemoryMemberRepository가 @ComponentScan으로 빈으로 등록되어서 스프링이 자동으로 알맞은 의존 관계 주입을 해준 것인가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
transacional이 빨간불이 떠요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) transacional어노테이션을 추가했는데 빨간불이 나오느데 어떻게 해야하나요?3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결스프링 핵심 원리 - 기본편
Bean등록 부분이 이해가 안됩니다.
첫번쨰로 수동으로 등록한다고 했을때 package hello.core.config; import hello.core.discount.DiscountPolicy; import hello.core.discount.impl.FixDiscountPolicy; import hello.core.discount.impl.RateDiscountPoilcy; import hello.core.member.repository.MemberReposotory; import hello.core.member.repository.impl.MemoryMemberRepository; import hello.core.member.service.MemberService; import hello.core.member.service.impl.MemberServiceImpl; import hello.core.order.service.OrderService; import hello.core.order.service.impl.OrderSerivceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderSerivceImpl(discountPolicy(), memberRepository()); } @Bean public MemberReposotory memberRepository() { return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPoilcy(); // 또는 RateDiscountPolicy()로 변경 가능 } } 이런식으로 @Configuration + @Bean으로 수동으로 등록하면 package hello.core.member.service.impl; import hello.core.member.domain.Member; import hello.core.member.repository.MemberReposotory; import hello.core.member.repository.impl.MemoryMemberRepository; import hello.core.member.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; //@Component public class MemberServiceImpl implements MemberService { // private final MemberReposotory memberReposotory = new MemoryMemberRepository(); private final MemberReposotory memberReposotory; public MemberServiceImpl(MemberReposotory memberReposotory) { this.memberReposotory = memberReposotory; } @Override public void join(Member member) { memberReposotory.save(member); } @Override public Member findMemer(Long memerId) { return memberReposotory.findById(memerId); } public MemberReposotory getMemberReposotory() { return memberReposotory; } }MemberSeriveImpl클래스에는 @Component를 안붙여도되는거죠? 두번째 질문은 제가 알기론 컴포넌트스켄을 사용안하고 Component만 클래스위에붙여도 자동적으로 빈으로 등록되는걸로아는데 꼭 ComponentScan을 적용해야만 Component가붙은 클래스들이 자동적으로 빈으로 등록되나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Transactional 적용되는 접근제어자 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서 @Transactional 애노테이션이 붙여있어도 public이 아니면 AOP가 적용이안된다고하고 V1 테스트의 internal에서 public을 지우고 했을때 적용이안된다고하셨는데 저는 public을 지워도 되더라고요 @Test void internalCall(){ callService.internal(); } @Transactional void internal(){ log.info("call internal"); printTxInfo(); } 결과화면 이유를 알고싶습니다.Dependencies관련 build.gradle 버전 plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' } group = 'hello' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { useJUnitPlatform() }
-
미해결스프링 핵심 원리 - 기본편
Section8_조회한 빈이 모두 필요할 때, List, Map 질문
오타도 없고 강의 코드와 똑같이 실행했는데 discountPolicy에 NULL값이 할당이 되어있습니다.policyMap에 rateDiscountPolicy, fixDiscountPolicy이 둘다 담겨져있는데 nullpointerexception이 발생하는 이유를 모르겠습니다.public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); return discountPolicy.discount(member, price); }
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
상품 수정 form이 안열립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]섹션8: 상품수정강의에서 1:51부분이 상품 수정 form이 안열립니다. @PathVariable("itemId")이렇게 고쳤고, 설정에 gradle도 인틀리제이에서 gradle로 바꾸고 했는데도 안됩니다..어떻게 해야 할까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
영속성 컨텍스트 1차캐시 질문
안녕하세요! 질문이 생겨 질문글 남깁니다 :) 영속성 컨텍스트는 트랜잭션을 사용하면 생겨난다 라고 말씀 해주셨는데요. 이중에 1차 캐시 부분에 대한 내용이 궁금해서 코드를 작성하던중에 의아한점이 생겼습니다. @Transactional public List<UserResponse> getUsers() { User user = userRepository.findById(4L).orElseThrow(); user.updateName("test"); userRepository.findById(4L); userRepository.findById(4L); return userRepository.findAll() .stream() .map(UserResponse::new) .toList(); }우선은 위 내용인데요, updateName을 호출한 시점에 변경 감지가 되어서 update문이 호출 되었는데, 이후에 로그로 찍히는 select문이 없더라구요. 1차캐시가 진행되면 그 이후에 객체의 값이 변경 되더라도 그 내용까지 다시 반영해서 캐싱 해주는걸까요? public List<UserResponse> getUsers() { userRepository.findById(4L); userRepository.findById(4L); userRepository.findById(4L); return userRepository.findAll() .stream() .map(UserResponse::new) .toList(); }그리고 두번째 질문은 코드를 이런식으로 트랜잭션 어노테이션 없이 작성했을 때 인데요.제 추측은 트랜잭션 어노테이션이 없으니 영속성컨텍스트가 생성되지 않을것이고 그에따라 select문이 3번 호출될것이다. 였는데 실행해보니 select문은 한번만 호출되더라구요.나름대로 왜일까 고민해본 결론은 findById가 구현된 SimpleJpaRepository클래스에 붙어있는 Transactional이 영향을 주는건가? 싶긴 한데 명확한 답은 모르겠습니다 ☹1차캐시에 한해서는 트랜잭셔널과는 독립되게 영속성컨텍스트가 동작하는걸까요?
-
미해결스프링 핵심 원리 - 고급편
오타 제보....
안녕하세요 강사님강의 잘 듣고 있습니다.수업 내용을 정리하다가 별거 아니지만....오타 제보 입니다! 창구 지원 -> 창구 직원
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
ddl-auto 관련 질문.
안녕하세요,24강 수강중에 궁금한점이 생겨 문의 남깁니다.야믈파일에 설정한 ddl-auto옵션 관련해서 validate로 값을 바꾼 뒤 몇가지 테스트를 해보았습니다. age필드를 완전히 제거name필드를 named 명칭으로 변경.name필드의 column()안에 들어가는 속성값들을 변경.이렇게 3가지를 해보았는데 실질적으로 테이블과 일치하지 않는다 라며 서버를 실행하지 않는 경우는 2번 name필드가 다른 명칭으로 변경되었을 때 한가지 경우더라구요. age는 nullable이라 아에 필드가 명시되지 않아도 일치한다고 판단하는걸까요?column 어노테이션 안에 들어가는 값들은 감지하지 못하는게 맞나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 관련 질문
세션에 대한 질문이 있습니다. jsessionId를 끄는 법 로그인 하든 안하든 주는데, 만약 토큰 같은 걸 인증에 사용한다면 필요 없을 것 같은데, 끄는 법이 있을까요? 저는 jsessionId 쿠키의 max-age = -1로 주도록 설정해서 껏는데, 더 좋은 방법이 있는지 궁금합니다. spring session redis를 사용해도 session 쿠키를 무조건 주고 redis에도 저장되는데 이것도 로그인시에만 발급하고 저장하게 바꿀 수 없을까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
스프링 시큐리티 6.0 강의를 구매했는데요. 혹시 이전강의 스프링시큐리티 Auth를 안들어도 괜찮은지 궁금하네요.
스프링 시큐리티 6.0 강의를 구매했는데요. 혹시 이전강의 스프링시큐리티 Auth를 안들어도 괜찮은지 궁금하네요. 인트로 보고 있는데, 이전강의 얘기 하셔서, 혹시 이전강의 봐야만 하는지..
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
[28000][1045] Access denied for user 'root'@'localhost' (using password: YES)
인텔리제이 내에서 데이터베이스를 실행하려고 하면 [28000][1045] Access denied for user 'root'@'localhost' (using password: YES) 이와 같은 경고문이 뜹니다. 해결방안을 알고 싶습니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
addForm 오류가 계속납니다
/add에 접속이 안됩니다add에 접속이 안됩니다bad request로 계속 접근불가가 뜹니다아래 구글 드라이브에 파일을 올렸습니다 https://drive.google.com/file/d/1XUpCkGaxXoFkA-CpDf7jNkcEHgTm06JD/view?usp=sharing
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
인프라계층 구현체와 테스트 구현체에 대한 질문
안녕하세요.UserRepository를 구현하는 구현체로는 UserJpaRepository를 사용하는 UserRepositoryImpl와 테스트용 구현체인 FakeUserRepository가 있는데요. TDD라는게 단순 객체지향적인 설계를 잘하는 방법론이라면 납득이 가는데, 실제 서비스 되어야 할 코드가 잘 동작하는지 검증하기 위함이라는 관점에서는 조금 궁금한점이 생겨 질문드립니다. FakeUserRepository는 UserRepository의 계약을 잘 이행하고 테스트도 성공하도록 잘 구현하였습니다.그런데 실제 서비스에 사용될 UserRepositoryImpl는 한번도 검증된 적 없는데 테스트를 통해 어떻게 소프트웨어가 변화함에 있어서 확신을 가질 수 있나요? UserRepositoryImpl 내부 구현이 변경되었을때 여전히 FakeUserRepository만 테스트를 실행할텐데 어떤식으로 개발 과정에서 확신을 얻을 수 있는지 궁금합니다. 추가적으로 TDD의 역할에는 어떤 구현 기술에 대해 잘 사용되었는지에 대한 검증은 포함되지 않나요? 예를 들어 스프링 데이터 JPA를 잘 사용하였는지..? 예를 들자면 저는 TDD를 해본적은 없지만 실제 실행되는 인프라 계층을 실행해볼 수 있는 샘플 테스트코드 개념으로 만들어서 사용하고 있는데요. 제가 개발하고 있는 기업용 솔루션이 버전이 높아짐에 따라 워낙 무거워져서 로컬 PC에서 WAS를 기동하는데에만 2분이 넘기 때문에 최소한의 인프라계층 혹은 인프라계층의 협력 클래스들정도는 테스트 코드로 직접 테스트해볼 수 있도록 테스트 코드를 작성해 두었습니다. 이렇게 해두면 어떤 이슈가 발생했을때도 곧바로 쉽게 테스트가 가능하니까요. 물론 DB 개발서버 장비에 연결하고 더미데이터를 가지고 실행하는 식으로요. 이번 강의에서 H2를 통한 인프라 테스트 강의까지가 딱 제가 하고 있는 테스트들이었는데요. 중간에 놓친것인지 테스트가 무거워진다는 설명만 하고 그뒤로는 리팩토링과 함께 인프라 레벨의 테스트는 언급을 안하셔서 제가 생각하는 구현 기술을 잘 사용하여 실제 서비스되는 인프라 모듈을 직접 테스트 하는 부분은 어떻게 해야할지 궁금합니다.