묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberServiceIntegrationTest 테스트 케이스 간섭 발생
안녕하세요. 감사히 영상을 보며 공부하고 있습니다.다름이 아니라 스프링 JdbcTemplate 적용 후 통합테스트를 진행해보는데,회원가입과 중복_회원_예외 테스트 메소드 개별 실행시 정상적으로 작동,클래스 테스트 실행시 중복_회원_예외 케이스 통과, 회원가입 케이스에서 에러가 발생하여 로그를 확인해보니,회원가입 테스트 실행 전, memberService.findMembers()를 통해 확인해본 결과, 중복_회원_예외 테스트케이스에서 put 하는 member 객체가 확인이 됩니다.Spring Boot와 JUnit 5를 사용하여 작성한 테스트 클래스의 경우, 테스트 메소드는 일반적으로 순차적으로 실행되지 않습니다. 대신, 각 테스트 메소드는 독립적으로 실행됩니다. 라고 확인이 되더라구요. 병렬적으로 실행되나, 컨텍스트가 분리되는것으로 보이는데, db는 같은걸 쓰다보니 에러가 발생하는게 아닐까 싶었습니다.그런데 영상에서는 통합테스트에서 이러한 에러가 발생하지 않는데, 어떤 차이때문일까요?*해당 코드 포함한 commit log link
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
OptimisticFacade, LettuceLockStockFacade 에 대해 @Transactional 질문
강의 잘 듣고 있습니다.다름이 아니라 OptimisticFacade 클래스의 decrease 메서드는 트랜잭션을 붙히지 않으셨는데 이는 optimisticLockStockService.decrease가 실질적인 DB 와 통신하는 부분이기 때문에 optimisticLockStockService.decrease에서만 @Transactional을 적용시켜야 하기 때문인것인가요?? 또한, LettuceLockStockFacade의 경우 redisLockRepository에 접근하는 부분이 있는데, 레디스에 접근시에는 트랜잭션을 걸어주지 않아도 될까요?또한, 제가 알기로는 @Query를 사용하는 경우 @Transactional이 적용되지 않는다고 알고 있는데, 그렇다면 Pessimistic과 Optimistic 의 decrease 메서드의 경우 @Transactional이 없어도 괜찮은것 일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
정적 팩토리 메서드에 static이 붙어야 하는 이유
안녕하세요. 강의 잘 보고 있습니다! 다른 분 질문에 궁금한 것이 해소되지 않아 질문드립니다.https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1&unitId=24297&category=questionDetail&q=30892&tab=community정적 팩토리 메소드 사용 이유중에 static 메모리에 올라가기때문에 새로운 객체를 생성하지 않는 장점이 있는 거라고 알고 있습니다. 이 예제의 경우 static을 빼도 JPA가 엔티티로 관리하면서 어차피 사용할 수 있는 부분아닌가요..? 라는 질문에서 강사님께서는 static을 빼보면 이해될 거라고 답변하셨습니다.제가 생각하기로는 정적 팩토리 메서드 안에서 생성자를 통해 인스턴스를 생성하는 것은 똑같아 보이고, 호출할 때 new가 아닌 Order.createOrder()로 호출하는 것 외에는 차이점을 못 느꼈습니다.조금 더 상세한 가르침을 주시면 감사하겠습니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Runwith 어노테이션 오류.. Junit4
강의대로 테스트 클래스 작성중인데.. @RunWith 어노테이션 자동완성이 안되더라구요..? 그래서 코드 복붙 했는데도 저렇게 뜹니다..junit4로 강의랑 똑같이 설정해서 작성했는데 뭐가 문제일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
dtype 조회 방법
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 다른 객체들은 id로 조회가 가능한데 dtype같은 경우는 조회를 어떻게 하는 건가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
커맨드성
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]선생님들.8:20 이 때 쿼리랑 커맨드 성을 분리하라. 이 말이트랜잭션 때문에 그런건가요? 그러니까 쿼리는 날리면 바로 flush가 되기 때문에 상관없는데, 말하시는 사이드이펙트라는게 그 영속성 컨텍스트 안에 있다가 트랜잭션 commit 시점에 모든 것이 다 DB로 날라가니까,Member를 직접 주게 되면 주소를 주는 것 이기때문에, 영속성 컨텍스트에도 영향을 미쳐, 뭔가 저렇게 save 해놓고 그 member를 직접 다루게 되면 save하는 그 값에도 영향이 있을 수 있기 때문에 그런건가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
지금도 application.yml 쓰는 추세인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]물론 회사마다 다를 것 같기는 한데..application.properties가 기본이니 뭔가 보통 이렇게 default로 하는 건 잘 맞기 때문에 두는 것 같아서.. 하긴 뭔가 설정을 표현하는 하나의 방법일 뿐이라 상관없는건가..강의가 이제 그래도 몇년 전꺼라 좀 바뀐 점이 있을까 해서요.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
itemName ,price 값 넣지 않았을때 차이
안녕하세요 강사님 bindingresult 편 강의 잘 듣고 있다가 궁금증이 생겨서 문의 드립니다.상품등록 폼에서 모든 필드에 값을 넣지 않고 post로 값을 전달했습니다 에러가 발생하면 스프링에서 new FieldError를 생성해 바인딩리절트에 담아서 다시 폼으로 값을 전달해주는 것으로 이해했습니다. 하지만 binding result 로그를 확인해보면 똑같이 전부 값을 주지 않았지만 itemName의 rejectedValue에만 아무값이 들어가있지않고,price와 수량에는 null이 들어갔습니다 왜 itemName만 null조차 들어가지 않는지 알 수 있을가요?사진 같이 첨부드립니다.항상 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스프링부트 3.15버전인데 junit5 vs junit4 어떤 걸 사용해야 하나요?
스프링부트 3.15버전 사용하고 있는데강의 자료에 나와있는 것처럼 build.gradle에 내용을 추가해서 junit4를 사용하는 게 좋을까요?추가하지 않으면 junit5로 동작하는 건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
build 오류
이렇게 오류가 뜨는데 어떻게 해결해야 하는지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ModelAttribute 사용하여 에러시 이전 데이터 유지 방식 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]현재 검증 직접 처리- 개발 부분을 수강중에 있습니다. 14분쯤에 영한님께서 에러 발생시 페이지를 다시 return 해도 이전 데이터를 사용하기 위해 Model 을 사용한다고 하셨습니다. 템플릿 엔진이 타임리프여서 유용한거 같은데 API 방식으로 진행하는 경우에는 해당 데이터를 서버에서 별도로 설계 해야하는건가요? 아니면 API로 만든경우에도 Model 과 같이 이전값을 유지하는 유용한 방법이 있는지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
validation에서 구체화 궁금증
item price에 대한 validation을 할때구체화된게 우선순위를 가진다 했는데 그냥 . 이 많고 길면 우선순위가 적용되는건가요?예를들면error =>item에 걸린다면item<item.itemprice<item.itemprice.max<item.itemprice.max.어쩌구저쩌구 이런식으로 뒤에붙는 말이 관련이 없더라도 구체화된것이니 우선순위가 더 높아지나요??
-
미해결스프링 부트 - 핵심 원리와 활용
프로메테우스 병렬처리 클라이언트
안녕하세요 질문이 있습니다. 프로메테우스 라이브러리로 클라이언트를 만들때파이썬 언어의 병렬처리를 이용하면 프로메테우스가 잘 작동하지 않는다는 코멘트가 있는데혹시 관련하여 아시는바가 있나요? 파이썬 언어를 사용하여,프로메테우스 병렬처리 클라이언트를 만들려고 하는데해당 사항이 맞다면 작업을 고려해봐야 할 것 같아서 고민입니다. 강의와 직접적인 연관이 없으나관련 분야에 전문가이실 것이라 생각되어질문 드렸습니다. 관련하여 아시는 내용이 있으시다면코멘트 부탁 드리겠습니다.
-
미해결
Spring JPA 다대다 관계 테이블 질문드립니다.
2개의 다대다 관계의 엔티티를 연결테이블을 이용해서 총 3개의 엔티티로 구성했습니다.Companion 엔티티@Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder @AllArgsConstructor public class Companion { // Companion 엔티티는 동반 여행에 참여하는 개별 동반자의 정보를 나타냅니다. // 회원들과의 다대다 관계를 통해 여러 회원과 연결될 수 있으며, 동반 여행의 세부 정보를 저장합니다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 동반자 엔티티의 고유 식별자 private String name; // 동반자의 이름 private String code; // 동반자를 구분하는 코드 정보 private Boolean isStart; // 동반 여행의 시작 여부 private Boolean isEnd; // 동반 여행의 종료 여부 private String tendency; // 동반자의 특성 정보 private String mate; // 동반자에 대한 추가 정보 private LocalDateTime startTime; // 동반 여행의 시작 시간 private LocalDateTime endTime; // 동반 여행의 종료 시간 @OneToMany(mappedBy = "companion") private List<MemberCompanion> companionMembers = new ArrayList<>(); }Member 엔티티@Entity @Getter @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class Member { // Member 엔티티는 시스템 사용자를 나타내며, 동반자와의 다대다 관계를 허용합니다. // 각 회원은 여러 개의 동반자와 연결될 수 있으며, 동반자 정보를 관리합니다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 회원 엔티티의 고유 식별자 @Column(unique = true) private String email; // 회원의 고유한 이메일 주소 private String nickname; // 회원의 사용자명 private String snsType; // 소셜 로그인 종류 private String originalId; // 고유 아이디 @OneToMany(mappedBy = "member") private List<MemberCompanion> myCompanions = new ArrayList<>(); }Companion과 Member를 연결하는 Entity@Entity @Getter @Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class MemberCompanion { // MemberCompanion 엔티티는 회원과 동반자 간의 관계를 정의하는 엔티티입니다. // 회원과 동반자를 관련시키며, 회원-동반자 관계의 역할 정보를 포함합니다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 회원-동반자 관계 엔티티의 고유 식별자 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; // 회원 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "companion_id") private Companion companion; // 그룹 @Enumerated(value = EnumType.STRING) private Role role; // 회원-동반자 관계 역할 (예: 리더, 구성원) } 문제가 발생한 것은, Companion을 build하고 생성된 Companion과 Member를 통해서 MemberCompanion을 생성한 후, 생성된 MemberCompanion을 다시 Companion의 companionMembers에 넣으려고하면 순환 참조 오류가 터집니다. Dto를 사용해봤지만 잘 해결이 안되어서 질문 올립니다./** * 그룹 등록을 처리하는 메서드 * * @param companionAddRequestDto 그룹 등록 요청 DTO * @return ResponseEntity 객체를 반환하여 등록 성공 또는 실패 응답을 전송 */ @Transactional public ResponseEntity registCompanion(CompanionAddRequestDto companionAddRequestDto) { Member member = memberRepository.findById(companionAddRequestDto.getMemberId()) .orElseThrow(() -> new EntityNotFoundException("회원을 찾을 수 없습니다.")); Companion companion = Companion.builder() .name(companionAddRequestDto.getName()) .code(generateRandomCode()) .isStart(companionAddRequestDto.getIsStart()) .isEnd(companionAddRequestDto.getIsEnd()) .tendency(companionAddRequestDto.getTendency()) .mate(companionAddRequestDto.getMate()) .startTime(companionAddRequestDto.getStartTime()) .endTime(companionAddRequestDto.getEndTime()) .companionMembers(new ArrayList<>()) .build(); companionRepository.save(companion); // MemberCompanion 엔티티를 생성 MemberCompanion memberCompanion = MemberCompanion.builder() .member(member) .companion(companion) .role(Role.LEADER) .build(); memberCompanionRepository.save(memberCompanion); // 등록 성공 응답을 생성하고 반환 return ResponseEntity.ok() .body(new SuccessResponseDto(true, "그룹 등록이 완료되었습니다.", companion)); }해당 코드에서memberCompanionRepository.save(memberCompanion);이후 companion.getCompanionMembers.add(memberCompanion)시 getCompanionMembers값이 null이라 나오고 다른 방법을 사용하면 순환참조가 발생합니다.해결 방법이 있을까요..?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
사이드 프로젝트.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. 강의 들으면서 사이드 프로젝트 진행해가면서 배운 내용을 써보고 싶습니다. 프로젝트에 사용될 템플릿은 무료 부트스트랩 템플릿 소스 코드를 가져와서 사용하면 될까요? ?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
url로 매핑된 컨트롤러를 찾는 것은 알겠는데 메소드는 어떻게 찾는 건가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]핸들러 매핑을 통해서 url이 들어오면 실행해야 할 컨트롤러를 찾는 것은 이해를 했습니다. 그런데 애노테이션 기반의 컨트롤러를 사용할 때 메소드에도 url이 매핑이 되었던데 이거도 스프링의 어떤 요소가 매핑 정보를 차례대로 조회하며 대응되는 것을 찾고 메소드를 수행해주는 것인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 이름(name)은 무엇이고, 어떤 역할을 하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서 등장한 두 용어(세션 아이디, 세션 이름)의 관계가 헷갈립니다.제가 이해한 바론, 세션 id는 클라이언트의 쿠키에 담아주는 랜던한 값으로, 해당 값으로 서버에서 세션을 찾습니다. 톰캣에선 jsessionid라는 이름으로 사용됩니다.그러나 강의에서 loginMember이란 이름으로 세션 name이 등장합니다. 어차피 세션 id로 세션을 식별할 수 있을텐데, 굳이 세션 이름이 존재하는 이유가 무엇일까요? 하나의 세션에 여러 정보를 담을 수 있고, 그 정보들을 식별하기 위한 식별자의 역할을 하는 걸까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션을 만드는 것과 회원 정보를 보관하는 것의 관계
===[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]HttpSession session = request.getSession();위 코드는 세션이 있으면 그대로 사용, 없으면 세션을 새롭게 생성이라고 공부했습니다. session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);그리고 위 코드는 세션에 로그인 회원 정보를 보관하는 거라고 이해했습니다. 여기서 궁금합니다.세션을 생성하는 것과 회원 정보를 보관하는 것이 따로 존재한다면, 세션을 생성한다는 것이 무슨 의미가 있는지 모르겠습니다. 만약 세션만 만들고 회원 정보를 넣지 않는다면 세션 저장소에 특정 JSESSIONID 값을 키로 가지지만, value는 null인 상태로 저장되는 걸까요?그리고 하나의 세션에 여러 쿠키를 가질 수 있다고도 이해했습니다. 어차피 유저를 식별하는 데 하나의 쿠키만 있으면 될텐데 왜 세션에 여러 쿠키를 저장할 수 있는지 모르겠습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
오류시 인풋 값 사라지는 이유
BindingResult 사용시 오류가 발생하면 인풋 값이 사라지는데 이유가 뭔가요?"validation/v2/addForm" view 템플릿에는 여전히 th:object로 item이 지정되어 있고 각 필드 값들도 th:field로 지정되어 있는데 사라지는 이유가 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링부트 + jsp로 프로젝트 생성하려면 jar가 아닌 war로 만들어야하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]강의에서 jsp사용하지않으므로 jar로 선택해달라고 하셨는데 그러면 스프링부트+jsp 사용시 war로 프로젝트를 생성해야하나요?그리고 war는 외부서버배포용이라고 말씀하셨는데 공부하면서 aws로 프로젝트 배포까지 해보려고 하거든요..(아직 하나도 모르긴합니당..ㅠㅠ)배포 하게 될 때에는 jar가 아닌 war로 변경해서 배포해야하는걸까요?