묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
어노테이션 질문이있습니다.
안녕하세요 질문이 있습니다 API 강의 듣다가 궁금증이 생겨서 질문을 남기게 되었습니다. @RequestParam 은 매개변수의 값을 반환하는건가요?@RequestMapping("/save") public ModelAndView save(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); int age = Integer.parseInt(request.getParameter("age")); ... }이 코드를@PostMapping("/save") public String save(@RequestParam("username") String username, @RequestParam("age") int age, Model model) { ... }요렇게 바꿔줄 수 있는 역할이 @RequestParam 인 건가요? 그리고 RequestParam 을 쓸때 달아주는 어노테이션이 @ResponseBody 인건가요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
학습방향 질문드립니다
안녕하세요 mvc강의를 2편까지 모두 듣고 야생형코스를 따라가려고 jpa1편을 수강중입니다.현재 섹션2까지 들었는데 도메인 분석과 엔티티설계시 강사님께서 설명해주신 다대다관계, 연관관계 메서드 등 확실히 이해는 안가지만 이런게 있구나 하며 넘어가도 되는걸까요?이 강의에서는 jpa를 알아가보는 것보다 스프링에서 jpa를 어떻게 쓰는지만 알고 이 강의 듣고 기본편으로 넘어가도 되는걸까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
트랜잭션 시작
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]pdf에 @Transactional 설명하는 부분에서 테스트 시작 전에 트랜잭션을 시작하고~ 라는 말이 있는데, 여기서 말하는 트랜잭션이 시작한다는게 무엇을 시작한다는 건가요?
-
미해결스프링 핵심 원리 - 기본편
setter 주입 시의 생성자
클래스에 생성자가 단 1개 존재하는 경우 @Autowired를 생략할 수 있다고 하셨는데, 이는 생성자 주입을 하는 경우에만 해당하는걸까요? setter 주입을 하기 위해 OrderServiceImpl에 setter를 정의하고 각 setter에 @Autowired를 붙였다면, 이때는 생성자 주입이 아닌 setter 주입이 이뤄지는 걸까요? 제가 추가적으로 OrderServiceImpl의 생성자에 출력문을 두었더니 memberRepository에 스프링 컨테이너에 존재하는 MemoryMemberRepository 객체의 주소값이 들어왔습니다... 생성자 주입도 이뤄지고 setter 주입도 이뤄지는 건가요...?public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { System.out.println("OrderServiceImpl.OrderServiceImpl"); System.out.println("memberRepository = " + memberRepository); this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; }
-
미해결실전! 스프링 데이터 JPA
낙관적 락에 대해 질문이 있습니다.
Hibernate는 @Version을 사용하고, Lock 옵션을 @Lock(LockModeType.OPTIMISTIC)을 사용할 경우에 NONE 모드와 다르게 엔티티를 수정하지 않고 단순히 조회만 해도 버전을 확인한다고 강사님 JPA 책에 작성되어있습니다. 실제 코드로 구현해보니 버전만 확인하는거 같더라구요그 사이에 다른 트랜잭션이 해당 엔티티를 수정하여 버전이 변경되어도 ObjectOptimisticLockingFailureException 예외가 발생하지 않습니다. 간단하게 로직을 설명드리면 트랜잭션 A가 옵티미스틱 락 모드로 회원을 조회합니다. version = 0트랜잭션 A를 5초 대기합니다.트랜잭션 B가 회원을 수정하여 버전이 변경됩니다. version = 1트랜잭션 B가 종료됩니다.5초가 지나 트랜잭션 A가 종료됩니다.트랜잭션 A가 종료될 때 옵티미스틱 락 모드라서 마지막에 버전을 확인합니다.select version as version_ from member where id=?그런데 트랜잭션 A가 종료될때에 회원 버전이 다르지만 예외가 발생하지 않습니다. 이러면 OPTIMISTIC의 용도가 트랜잭션을 커밋할 때 버전 정보를 조회해서 현재 엔티티의 버전과 같은지 검증한다. 만약 같지 않으면 예외가 발생한다고 작성되어있는데 예외가 발생하지 않는다면 강사님께서 설명해주신 조회한 엔티티는 트랜잭션이 끝날 때까지 다른 트랜잭션에 의해 변경되지 않아야한다. 조회 시점부터 트랜잭션이 끝날때까지 조회한 엔티티가 변경되지 않음을 보장한다.이 말의 다른 의미가 어떤건지 궁금합니다 !아니면 제가 테스트를 잘못하고 있는 걸까요..? 아래는 로직에 대한 간단한 코드입니다.도메인package org.example.stock_rt_1.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter @NoArgsConstructor public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long id; private long personId; private int age; @Version private Long version; public Member(long personId, int age) { this.personId = personId; this.age = age; } public void addAge() { ++this.age; } }리포지토리package org.example.stock_rt_1.repository; import jakarta.persistence.LockModeType; import org.example.stock_rt_1.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; import java.util.Optional; public interface MemberRepository extends JpaRepository<Member, Long> { @Lock(LockModeType.OPTIMISTIC) Optional<Member> findByPersonId(Long id); }서비스package org.example.stock_rt_1.service; import lombok.RequiredArgsConstructor; import org.example.stock_rt_1.domain.Member; import org.example.stock_rt_1.repository.MemberRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; @Service @RequiredArgsConstructor public class MemberService { public final MemberRepository memberRepository; @Transactional public void addAge(long personId) { sleep(500); //findMember가 먼저 실행되야하기 때문에 넣었습니다. Member member = memberRepository.findByPersonId(personId).orElseThrow(); member.addAge(); } @Transactional public void findMember(long personId) { memberRepository.findByPersonId(personId); sleep(5000); } private void sleep(long mills) { try { Thread.sleep(mills); } catch (InterruptedException e) { System.out.println("e = " + e.getMessage()); } } }테스트코드package org.example.stock_rt_1.service; import org.example.stock_rt_1.domain.Member; import org.example.stock_rt_1.repository.MemberRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class MemberServiceTest { @Autowired private MemberService memberService; @Autowired private MemberRepository memberRepository; @Test @DisplayName("회원 정보를 조회중 다른 트랜잭션에서 정보를 변경했다.") void addAge() throws InterruptedException { // given int personId = 5555; memberRepository.save(new Member(personId,15)); // when Thread selectThread = new Thread(() -> memberService.findMember(personId),"트랜잭션-A"); selectThread.start(); Thread updateThread = new Thread(() -> memberService.addAge(personId),"트랜잭션-B"); updateThread.start(); selectThread.join(); updateThread.join(); } }로그[트랜잭션-A] : select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? Hibernate: select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? [트랜잭션-B] : select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? Hibernate: select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? [트랜잭션-B] : update member set age=?,person_id=?,version=? where id=? and version=? [트랜잭션-B] : select version as version_ from member where id=? [트랜잭션-A] : select version as version_ from member where id=?
-
미해결스프링 핵심 원리 - 기본편
수동 빈 등록 vs 수동 빈 등록
수동 빈 등록 vs 수동 빈 등록에 대해 다루시지 않았다는 점이 궁금해서 질문드립니다. 제가 생각한 이유는 다음과 같은데, 실무 경험이 없어서 오류가 있을 것 같은데 오류 알려주시면 감사하겠습니다. 보통 애플리케이션의 설정 클래스는 1개 만들고, 이 클래스 내에서 여러 메서드(빈 등록 메서드)를 정의합니다. 중복되는 이름을 가진 메서드(= 빈의 이름이 중복됨)를 정의하면 자바 언어 차원에서 메서드 중복 정의되었다고 컴파일 오류로 알려주기 때문에 빈 이름(= 메서드 이름)을 중복 정의할 일이 없기 때문입니다.그런데, 생각해보면 @Bean도 name 옵션을 통해 빈 이름을 변경할 수 있고, 그렇다면 수동 빈 등록 시에도 빈 이름 중복 문제가 발생하는데 수동 빈 등록 vs 수동 빈 등록에 대해 다루시지 않는 이유가 무엇인가요? 혹시 자동 빈 등록보다 수동 빈 등록을 사용할 일이 적어서 그러한 것인가요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
WebServerCustomize의 어노테이션을 주석처리 하는 이유??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Component를 주석처리하면 스프링 빈에 등록이 안되어 있으니 개발자가 예외처리를 안하고 발생한 예외를 스프링이 자동으로 처리하게 하도록 위함인건가요? 스프링은 /error의 경로로 자동 등록되는것은 이해하였는데 그 하위 html파일에 어떻게 매핑이 되는건지 잘 모르겠습니다. 그 이전에는 직접 경로를 설정해 주었는데 스프링이 자동으로 하는 경우에는 에러코드가 이름으로 설정된 html파일을 자동으로 보여주는 건가요?
-
미해결실전! 스프링 데이터 JPA
PageRequest, pageable
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이전 강의에서는 PageRequest.of(pagenum, pagesize, sort.by()) 를 사용해서 직접 설정해줘서 리포지토리 매서드에 인자로 넘겼는데 mvc의 @PageableDefault를 사용하면 이런 부분을 자동으로 처리해준다라고 이해해도 괜찮을까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
MVC 패턴이 헷갈려서 질문드립니다.
만약 프로젝트에서 model 패키지dto 패키지entity 패키지service 패키지repository 패키지controller 패키지view 패키지위와 같은 구조를 가졌다면,mvc에 대입했을 때, controller와 view 패키지를 제외한 모든 패키지가 model에 해당한다. 만약 1번이 맞다면, service 패키지와 repository 패키지가 비즈니스 로직을 담당하고, model 패키지는 단순 데이터 관리만 해서 mvc에서의 model이라는 말과 서로 의미가 다르지 않은지에 대해 질문드립니다. 말 그대로 model 패키지, view 패키지, controller 패키지가 각각 mvc이고 service와 repository는 별개다.만약 2번이 맞다면, mvc에서의 model은 비즈니스 로직까지 포함하는 것으로 아는데 service 패키지와 repository 패키지가 비즈니스 로직을 담당하면 model은 그 의미에 어긋나는게 아닌지 질문드립니다. 3. 패키지 구조를 일부 수정하여 더 완벽한 구조를 만들 수 있다면 그 예시에 대해 알려주시면 감사하겠습니다.
-
해결됨스프링 핵심 원리 - 기본편
프로토타입 빈과 스프링 컨테이너
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 프로토타입 빈 관련 궁금한 게 있습니다!프로토타입 빈 같은 경우 스프링 컨테이너가 프로토타입 빈 요청을 받으면 생성하고반환만 하지 관리를 하는 게 아니기 때문에 @PostConstruct 애노테이션이 붙은 초기화 메서드는 동작을 하지만 @PreDestroy 가 붙은 소멸 메서드는 동작을 안 하는 걸로 알고 있습니다.하지만 싱글톤 빈에 의존관계가 주입되어 있는 프로토타입 빈은 스프링 컨테이너가 싱글톤 빈을 관리하는 것처럼 주입된 프로토타입 빈 또한 관리를 하고 관련 요청에 대해서 인스턴스를 반환하니까 싱글톤 빈에서 사용하는 프로토타입 빈 관련 동작도 가능하다고 생각하는데 왜 컨테이너를 종료해도 프로토타입 빈의 소멸 메서드는 동작을 안 할까요?
-
미해결스프링 핵심 원리 - 기본편
스프링 빈 자동 등록 방식에서의 @Configuration
(@Bean을 통해 스프링 빈을 수동 등록하는 방식이 아닌) 컴포넌트 스캔을 통해 자동 등록하는 방식을 사용할 때도 @Configuration이 붙은 클래스에 CGLIB가 적용되나요?컴포넌트 스캔 방식을 사용하는 AutoAppConfig 클래스 내부에는 아무런 코드도 존재하지 않고, 그렇다면 AutoAppConfig@CGLIB에서 오버라이딩할 메서드가 존재하지 않습니다. 기존에는 오버라이딩된 메서드 내에 싱글톤을 보장하는 코드가 담겨 있었는데, 이 방식은 메서드가 아닌 클래스 단위로 스프링 빈을 등록하므로 CGLIB를 적용할 필요가 없어 보입니다.
-
해결됨스프링부트 시큐리티 & JWT 강의
jwt와 실제데이터의 관계
안녕하세요 강의 잘 보고 있습니다.jwt로 인증을 받은 후에 클라이언트가 필요한 데이터를 서버에서 클라이언트로 전송을 할때 그 데이터들이 해커에게 노출이 되면 안될거 같은데 그 데이터들은 따로 암호화가 돼서 전송이 되는건가요?
-
해결됨스프링부트 시큐리티 & JWT 강의
jwt 와 세션ID의 관계
안녕하세요 강의 잘 듣고있습니다.웹페이지가 서버에 처음으로 요청을 보낼때 서버에서 세션ID가 만들어지는 것으로 알고있습니다.JWT토큰은 로그인 요청시에 서버에서 만들어 지는 것이구요그러면 무조건 처음에는 www.naver.com으로 요청을 보내게 되는데 JWT토큰을 사용한다고 해도 세션ID는 만들어 지는 것이겠네요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Member 테이블 외 DB 생성이 되지 않음
[질문 내용]코드를 어제 새벽부터 계속 확인해보았는데 DB 생성이 되지 않습니다. 강사님과 스프링, DB 버전이 달라서 생기는 오류인가요? 해결 방법을 모르겠습니다.. JPA와 DB 설정, 동작 확인에서 Member 테이블은 생성이 되었습니다. 그러나 도메인 분석 설계 섹션 강의에서 진행한 Orders, category, delivery, item과 같은 테이블이 생성이 되지 않습니다. spring-boot는 3.2.4 버전을, H2의 경우 2.2.224 버전을 사용했으며, JUnit4는 현재 사용중인 springboot와 호환이 되지 않아 JUnit5를 사용하였습니다. 아래 드라이브 링크는 코드 전체 압축파일 입니다!https://drive.google.com/file/d/1_Xithr3ZMw4MzcHRz1E2TDypWM0c-_Ry/view?usp=sharing
-
미해결스프링 핵심 원리 - 기본편
빈 등록과 의존관계 주입 순서
스프링 빈과 의존관계 주입의 순서에 대해 질문드리고자 합니다. @ComponentScan에 의해 스프링 빈을 등록하고, @Autowired를 통해 의존관계 자동 주입이 이뤄진다고 하셨습니다. 그런데, MemberServiceImpl 객체가 생성되기 위해서는 우선 의존관계 주입이 이뤄져야 합니다(생성자 호출). 순서를 따지자면 @Autowired에 의해 의존관계 자동 주입 -> 객체 생성 -> 스프링 빈으로 등록이라고 생각하는데요. (1) 스프링 빈 등록 (2) 의존관계 주입이라는 두 과정은 순서가 없이 섞여서 진행되는 것인지, MemoryMemberRepository와 RateDiscountPolicy와 같이 의존관계 주입이 필요없는 모든 빈을 등록하고 이후에 의존관계 주입이 필요한 클래스에 대해 의존관계 주입과 스프링 빈 등록이 섞여서 진행되는 것인지, 스프링 빈 등록과 의존관계 주입의 순서를 따지는게 큰 의미가 없는 것인지에 대해 여쭤보고자 합니다. 이전 강의에서 두 과정이 순서대로 일어난다? 섞여서 일어난다? 라는 강의를 들었던 것 같은데 이 부분이 헷갈려서 질문드립니다.
-
미해결스프링 핵심 원리 - 기본편
메서드 뿐만 아니라 클래스 자체를 스프링 빈으로 등록 가능한가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, 섹션 5의 "컴포넌트 스캔과 의존관계 자동 주입 시작하기" 강의 듣다가 궁금증이 생겨서 글 남깁니다.이전 강의들에서 @Configuration 이 붙은 클래스를 구성 정보로 등록하고,해당 클래스 내부의 @Bean 이라는 애너테이션이 붙은 메서드들을 스프링 빈에 등록한다고 이해했습니다. 근데, 구성 정보로서 등록할 클래스 앞에 @ComponentScan 애너테이션을 붙이고,스프링 빈으로 등록할 클래스 앞에 @Component 애너테이션을 붙이는 부분이 잘 이해가 되지 않습니다. 스프링 컨테이너에 빈으로 등록할 수 있는 건 메서드(@Bean 처럼) 뿐만 아니라,클래스 자체(@Component) 를 통째로 빈으로 등록할 수 있는건가요? 만약 클래스 자체를 통째로 빈으로 등록할 수 있다는 말씀이시라면,@Component 애너테이션이 붙은 클래스 내부에 있는 모든 메서드들과 변수들을 자동으로 빈으로 등록한다는 것이고,이것들을 .getBean() 메서드를 통해 조회할 수 있다는 것인가요?
-
미해결스프링 핵심 원리 - 고급편
쓰레드로컬이 제공하는 별도의 저장소와 싱글톤의 관계
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, 쓰레드 로컬이 가지는 별도의 보관소 개념이 정확하게 이해가 되지 않아 질문을 남깁니다. 1. 쓰레드 로컬이 만드는 별도의 전용 보관소라는 것은 하나의 객체를 생성하여 그곳에 정보값을 저장해 두었다가 해당 쓰레드가 싱글톤으로된 객체의 정보값을 호출할 때마다 참고하게 되는 것인지, 아니면 다른 방식으로 설계된 것인지 궁금합니다. 2. 결국 특정 쓰레드마다 별도의 저장소를 통해 정보값을 보관하게 한다면, 그리고 그 보관하는 것이 객체를 생성하는 방식이라면, 동시성 문제를 발생시키는 싱글톤 대신 프로토타입을 사용하면 되는 것이 아닌가 생각이 드는데 프로토타입이 아닌 쓰레드 로컬로 해결해야하는 이유가 무엇인지 궁금합니다.
-
해결됨스프링 핵심 원리 - 기본편
5분대부터 말씀하신 테스트에 대한 질문
안녕하세요 영한님. 강의 너무 잘 듣고 있습니다.다름이 아니라 강의 듣다가 테스트 코드의 중요성을 말씀해주셨는데, 궁금한 점이 있어서요 단위 테스트를 작성하는 것이 좋다단위 테스트는 스프링이나 DB를 활용하는 것이 아니다이렇다면, 단위 테스트할 때는 Fake 객체를 사용해서 단위테스트를 작성해야 하는 걸까요? 인터페이스로 역할과 구현이 분리된 상태에서 MemberRepository의 구현체를 프로덕션에서 사용하는 MemoryMemberRepository, 테스트 환경에서 사용할 FakeMemberRepository로 분리해서 사용하는 걸까? 하는 궁금함이 있어 여쭈어봅니다 항상 좋은 강의 감사합니다!!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
45강. unable to access jarfile build/libs/library-app-0.0.1-SNAPSHOT.jar
빌드 파일을 실행해 줄 때 처음에 뒤에 profile 설정을 까먹어 후에 다시 profile 설정 붙여서 진행해주었는데, 제목과 같은 오류가 계속 뜹니다..구글링에 원인들에 대한 해결책을 실행해봤는데 그런 원인이 아닌 것 같아 질문 올립니다감사합니다!
-
미해결스프링 핵심 원리 - 기본편
10분쯤 에러....
뭐가 문제일까요?? 해결하고 집에 가고 싶어요ㅠㅠㅠ