묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
p6spy 사용시 log 두번 출력
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]p6Spy를 사용하는 중 로그가 두번 찍히는 경우가 생겼습니다.현재 mariaDB를 사용중이며,jpa: properties: hibernate: show-sql: 'false' format_sql: 'true'설정은 이렇게 해줬습니다. 혹시 왜 두번찍히는 건지 알 수 있을까?gradle에 p6spy 추가해주었습니다.implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
-
미해결Practical Testing: 실용적인 테스트 가이드
안녕하세요 강사님 컨트롤러 테스트 질문입니다!
좋은 강의를 찍어주셔서 너무 감사합니다.덕분에 테스트에 접근하는 방법을 터득할 수 있었습니다!컨트롤러 테스트는 Validation 역할이 핵심이라고 이해했는데,@Valid 어노테이션을 부착한 DTO 검증만 강의를 통해 배웠습니다. 궁금한게 있습니다.시큐리티를 적용했을 때 저는 컨트롤러 메서드 매개변수에 Authentication을 이용해서 SecurityContext 값을 사용하는데,이러한 SecurityContext도 검증을 해야 되는지,PathVariable에 대한 검증도 필요한가요?Param값 검증도 필요한지 궁금합니다.페이징했을 때 페이징 결과도 검증을 해야 될까요?Validation 영역이 아니라고 판단되어지는데, 강사님의 의견이 궁금합니다! 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원가입 테스트 select 문이 나가는 이유.
@Test public void 회원가입(){ Member member = new Member(); member.setName("memberA"); Long savedMemberId = memberService.join(member); Member findMember = memberService.findOne(savedMemberId); assertThat(member).isEqualTo(findMember); }근데제가 em.find() 동작이 먼저 영속성 컨텍스트에서 찾아보고 있으면 그걸 return.없으면 DB에 쿼리 날려서 가져온 다음에 return.(쓰기지연은 잠깐 생각 안하고)로 알고 있는데, 그렇다면 코드상멤버 생성하고,join해서 쿼리가 쌓이고,그 다음 findOne해서 가져오는데, 저게 결국은 em.find() 잖아요. 그러면 이미 영속성 컨텍스트에 id가 같은 게 있기 때문에 그걸 반환하잖아요. 그래야 할 것 같은데 select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.name=?이렇게 로그로 나가요.그래서 아, isEqualTo니까 혹시 막 이름같은 거 참조해서 가져오는 건가? 했는데isSameAs 해봐도 똑같아요.왜 하필 name으로 조회하는지도 모르겠어요.em.find()쪽이 실행된 것은 분명해요.
-
미해결실전! Querydsl
on()구문 질문입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]아래의 두 코드는 방식의 차이일뿐 같다라고 봐도 무방할까요?- 연관관계가 있는 경우from(member).join(member.team, team)- 연관관계가 없는 경우from(member).join(team).on(member.team.id.eq(team.id))
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방관계 편의 메소드 이름
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]set~~~ 말고 다른 이름이 좋지 않나요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
SpringPhysicalNamingStrategy 바뀐건가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]찾아도 안나오는데 CamelCaseToUnderscoresNamingStrategy 이걸로 바뀐 것 같네요.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
[정보] 카테고리
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]저도 뭐 저런 거 할 때 그냥 1depth 카테고리 테이블, 2depth 카테고리 테이블 이렇게 있는 거 아니야? 이렇게 생각했는데,요런 식으로 그러니까,아마도 내 depth, 부모 id, 그 정도로 해서 가져오는 듯 싶네요.대충 내 depth, 부모_id, 카테고리네임 이 정도로 해서한 카테고리 테이블에 다 때려넣는 식 인거 같아요. 그러니까 예를 들어 id를 통해 카테고리를 가져오게 되면,거기에 부모_id, 또 나의 자식들은 내 id를 가지고 있을 테니parent도 가져올 수 있고, child 들도 그냥 cc.parent_id = c.category_id 해서 가져올 수 있는..
-
미해결Practical Testing: 실용적인 테스트 가이드
Request Dto에서 생성자 관련...
강의에서 RequestDto를 Builder 패턴으로 생성자를 만들어주셨는데 그렇게 생성하신 이유가 있을까요?? 코드에서 확인해보면 이 생성자를 사용하지 않는걸로 확인이 되는데 .. 제가 추측하기로는 그 이후에 확장성을 위해서?,,, 라고 추측을 해봤는데 다른 이유가 있을까요????
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
h2 실행 불가 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]환경: macOS Sonoma 14.1 이전 스프링 로드맵에서는 ./h2.sh하면 실행이 잘 됐는데, 이 강의부터는 터미널에 이 내용이 나옵니다.[./h2.sh: line 3: 1300 Trace/BPT trap: 5 java -cp "$dir/h2-2.2.224.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@"]제 생각에는 스프링 로드맵 끝부분에서 자바 17을 설치하라고 해서 홈브류로 17버전 받은 다음부터 이렇게 된 것 같은데 h2를 어떻게 실행해야 할까요?오류 리포트-------------------------------------Translated Report (Full Report Below)-------------------------------------Process: java [1367]Path: /Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home/bin/javaIdentifier: java Version: ???Code Type: ARM-64 (Native)Parent Process: Exited process [1365]Responsible: Terminal [631]User ID: 501Date/Time: 2023-11-05 13:53:40.4677 +0900OS Version: macOS 14.1 (23B74)Report Version: 12Time Awake Since Boot: 1500 secondsSystem Integrity Protection: enabledCrashed Thread: 0 Dispatch queue: com.apple.main-threadException Type: EXC_BREAKPOINT (SIGTRAP)Exception Codes: 0x0000000000000001, 0x000000018c3ae4e4Termination Reason: Namespace SIGNAL, Code 5 Trace/BPT trap: 5Terminating Process: exc handler [1367]Application Specific Information:References to Carbon menus are disallowed with AppKit menu system (see rdar://101002625). Use instances of NSMenu and NSMenuItem directly instead.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
이번 예제에서 Integer말고 int로 엔티티의 필드가 작성된 이유가 있을까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Integer가 객체라 null이나 그런 것에서 비교적 안전하다고 배웠었던거 같은데.. int로 한 이유가 있을까요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
7강 수강 중 똑같이 따라했는데 경고가 떠요
어떻게하면 위 경고문구를 없앨 수 있는 지 궁금합니다.인텔리제이 2023버전을 쓰는 것도 문제가 될까요?
-
미해결실전! 스프링 부트와 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로 하는 건 잘 맞기 때문에 두는 것 같아서.. 하긴 뭔가 설정을 표현하는 하나의 방법일 뿐이라 상관없는건가..강의가 이제 그래도 몇년 전꺼라 좀 바뀐 점이 있을까 해서요.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@ColumnTransformer 사용시 문의사항
안녕하세요. DB는 PostgreSql로 DB암호화로 특정 컬럼 데이터가 암호화된 상태입니다.구글링을 해보니 @ColumnTransformer를 통해 암/복호화가 가능하다고해서정상적으로 확인했습니다.다만, read,write프로퍼티내에 보안에 민감한 key값이 직접적으로 들어가서application파일 따로 두고싶은데 방법이 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스프링부트 3.15버전인데 junit5 vs junit4 어떤 걸 사용해야 하나요?
스프링부트 3.15버전 사용하고 있는데강의 자료에 나와있는 것처럼 build.gradle에 내용을 추가해서 junit4를 사용하는 게 좋을까요?추가하지 않으면 junit5로 동작하는 건가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Kafka connector
window 사용 중이고, 서버는 전부 열려있습니다만, POSTMAN에서 JSON 형식으로 { "name" : "my-source-connect", "config" : { "connector.class" : "io.confluent.connect.jdbc.JdbcSourceConnector", "connection.url":"jdbc:mysql://localhost:3306/mydb", "connection.user":"root", "connection.password":"test1357", "mode": "incrementing", "incrementing.column.name" : "id", "table.whitelist":"users", "topic.prefix" : "my_topic_", "tasks.max" : "1" }를 보냈을 때 뜨는 오류가 "error_code": 500, "message": "Failed to find any class that implements Connector and which name matches io.confluent.connect.jdbc.JdbcSourceConnector, available connectors are: PluginDesc{klass=class org.apache.kafka.connect.file.FileStreamSinkConnector, name='org.apache.kafka.connect.file.FileStreamSinkConnector', version='3.6.0', encodedVersion=3.6.0, type=sink, typeName='sink', location='classpath'}, PluginDesc{klass=class org.apache.kafka.connect.file.FileStreamSourceConnector, name='org.apache.kafka.connect.file.FileStreamSourceConnector', version='3.6.0', encodedVersion=3.6.0, type=source, typeName='source', location='classpath'}, PluginDesc{klass=class org.apache.kafka.connect.mirror.MirrorCheckpointConnector, name='org.apache.kafka.connect.mirror.MirrorCheckpointConnector', version='3.6.0', encodedVersion=3.6.0, type=source, typeName='source', location='classpath'}, PluginDesc{klass=class org.apache.kafka.connect.mirror.MirrorHeartbeatConnector, name='org.apache.kafka.connect.mirror.MirrorHeartbeatConnector', version='3.6.0', encodedVersion=3.6.0, type=source, typeName='source', location='classpath'}, PluginDesc{klass=class org.apache.kafka.connect.mirror.MirrorSourceConnector, name='org.apache.kafka.connect.mirror.MirrorSourceConnector', version='3.6.0', encodedVersion=3.6.0, type=source, typeName='source', location='classpath'}" 입니다. 어떤오류인지 잘 모르겠네요
-
미해결
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이라 나오고 다른 방법을 사용하면 순환참조가 발생합니다.해결 방법이 있을까요..?