묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 프레임워크는 내 손에 [스프2탄]
강사님 질문입니다!
저는 페이징과 검색위주로 보고자 이 강의를 구매하게되었습니다. 프로젝트 진행중이라서 게시판이나 답글은 많이 해봤어서 페이징으로 넘어가고싶은데.. 이럴려면 페이징 이전의소스가 필요해서요.. 프로젝트가 만히 급해서.. 혹시 회차별로 소스코드제공이 가능할까요? ㅠㅠ..
-
미해결실전! 스프링 데이터 JPA
Percictence Context에 대해 질문있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 현재 JPA에 대해 공부하고 있는 학생입니다. 현재 N+1에 대한 이슈를 테스트하는 중에 Entity의 생명주기에 대한 궁금점이 있어 질문을 남겼습니다.EntityManager 초기화 시 1차 캐시에 있는 Entity는 자동으로 Flush가 되나요?N+1 확인을 하기위해 모든 Entity를 저장한 후EntityManager를 초기화 시켜 1차 캐시를 초기화시켰습니다. 이유는 1차 캐시에 원하는 Entity가 존재한다면 해당 Entity를 DB를 거치지 않는다고 알고 있어서입니다.코드는 다음과 같습니다.@ExtendWith(SpringExtension.class) @DataJpaTest public class StudyRoomRepositoryTest { @Autowired private StudyRoomRepository studyRoomRepository; @Autowired private UserRepository userRepository; @PersistenceContext EntityManager em; private List<StudyRoom> studyRooms = new ArrayList<>(); private List<User> users = new ArrayList<>(); @BeforeEach public void setUp() { users.add(userRepository.save(User.builder().userUuid(UUID.randomUUID()).email("tester@gmail.com").password("password").nickName("tester").build())); users.add(userRepository.save(User.builder().userUuid(UUID.randomUUID()).email("tester2@gmail.com").password("password").nickName("tester2").build())); studyRooms.add( studyRoomRepository.save(StudyRoom.builder().roomName("TestStudyRoom1").constructor(users.get(0)).build())); studyRooms.add( studyRoomRepository.save(StudyRoom.builder().roomName("TestStudyRoom2").constructor(users.get(1)).build())); } @Test @DisplayName("users N+1 문제 Test") public void UsersNPlusOneTest(){ em.clear(); //EntityManager 초기화 List<StudyRoom> findStudyRooms = studyRoomRepository.findAll(); for(StudyRoom findStudyRoom: findStudyRooms){ System.out.println(findStudyRoom.getConstructor()); } } }예상대로 N+1 이슈에 대해 확인할 수 있었습니다. 하지만 궁금한점이 생겼습니다. 제가 알기로는 Save 메소드가 호출된다 해도 Transaction이 진행중이면 실제 DB에는 안 넘어가는것으로 알고있습니다. 또한 만약 DB로 넘기고 싶다면 Flush를 통해 넘길 수 있는 것으로 알고있습니다. 근데 저는 SaveAndFlush() 메소드가 아닌 Save() 메소드를 호출했음에도 불구하고 Select Query로그가 찍힙니다.Hibernate: select studyroom0_.study_room_id as study_ro1_1_, studyroom0_.create_at as create_a2_1_, studyroom0_.is_deleted as is_delet3_1_, studyroom0_.update_at as update_a4_1_, studyroom0_.user_id as user_id7_1_, studyroom0_.room_name as room_nam5_1_, studyroom0_.room_uuid as room_uui6_1_ from study_rooms studyroom0_ Hibernate: select user0_.user_id as user_id1_2_0_, user0_.create_at as create_a2_2_0_, user0_.is_deleted as is_delet3_2_0_, user0_.update_at as update_a4_2_0_, user0_.email as email5_2_0_, user0_.nick_name as nick_nam6_2_0_, user0_.password as password7_2_0_, user0_.role as role8_2_0_, user0_.user_uuid as user_uui9_2_0_ from users user0_ where user0_.user_id=? com.twoleader.backend.domain.user.entity.User@522fb69이유를 잘 모르겠습니다. 제 예상으로는 EntityManager의 clear()메소드 호출 시 1차 캐시 안에 Entity들이 존재한다면 자동으로 Flush()메소드가 호출되는 것으로 추측이 되는데 맞는지 여쭙고 싶습니다. 만약 아니라면 해당 데이터는 어디서 불러온것인지 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
44강 mysql 접속중 문제가 있습니다.
강사님 안녕하세요.mysql에 mysql -u root -p 명령어를 통해 접속하고 그다음 비밀번호를 치려는데입력 자체가 안되고 엔터밖에 칠 수가 없더라구요.이런 문제가 왜 발생하는 걸까요?복사 붙여넣기 단축키, 키보드 타자 다 안됩니다.엔터만 쳐져서 계속 저런 상태입니다...
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
최신 날짜 기준으로 스타터에서 설정을 어떻게하면 될까요 ??
[질문 내용]최신 날짜 기준으로 스타터에서 설정을 어떻게하면 될까요 ??
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
9:27 에 나오는 부분 찾아봤습니다.
public static MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables) { return MockMvcRequestBuilders.get(urlTemplate, urlVariables) .requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, urlTemplate); }위의 코드는 RestDocumentationRequestBuilders의 get()입니다.Spring REST Docs2 - 요청, 응답필드의 9:27에서 하신 말씀 듣고 상속 관계이지 않을까하는 생각이 들었고 궁금해서 들어가보니 상속이 아닌RestDocumentationRequestBuilders의 get()에서 내부적으로 MockMvcRequestBuilders의 get()를 호출해주더라구요.MockMvcRequestBuilders가 추상클래스지만 get()이 static으로 선언되어 있어 상속을 해도 오버라이드를 할 수 없기에 저런 식으로 만들었지 않았을까?라고 추측을 해봤습니다.그러면서 추가적으로 위의 클래스들이 추상클래스로 만들어져 있고 메소드가 전부 static으로 선언되어 있는 것에 대해 이유가 궁금했습니다.추상클래스는 추상 메소드를 선언하고 상속을 하면서 오버라이드를 통한 다형성을 위해 사용한다고 알고 있었는데 여기서는 다른 목적과 방식으로 사용하고 있는 것처럼 보였기 때문입니다.그래서 검색을 해봤지만 키워드를 잘못 선택했는지명확하게 답을 찾지는 못했고, 추상 클래스와스태틱 메소드에 대해 각각 찾아보면서"객체 생성 제한과 메모리 이득 때문인가?"라는 생각이 들더라구요.하지만 추상클래스도 익명객체를 사용하면 객체 생성이 가능해지는 걸로 아는데 그래서인지RestDocumentationRequestBuilders는 생성자도 private으로 선언해 익명 객체로도 생성이 안되게 막아 놨지만 MockMvcRequestBuilders같은 경우는 생성자를 따로 막아 놓지 않아서 익명 객체로 생성이 가능하더라구요. 이렇게 차이를 두는 이유는 뭔가요??그리고 위의 클래스들처럼 선언한 이유도 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
인텔리제이 -> 이클립스 연동 못 하나요?
제가 인텔리제이를 사용해 본 적이 없는데 강의를 보고 환경설정을 하자니 못 따라가는 부분이 너무 많아 이클립스로 진행하려고 합니다... 불가능할까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
rest일때만 무한 루프 도는 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]그냥 컨트롤러에서 model에 담아서 조회할떄는 무한루프가 안도는데 json으로 반환할떄는 왜 무한로프 도는지가 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
읽기전용의 의미및 객체의 참조 업데이트
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]우선 강의 초반 내용중 Team 객체의 members는 읽기전용이다. 때문에 members를 업데이트해도 JPA에서 update나 insert가 이뤄지지 않는다, 라고 하셨는데 findTeam.getMembers().get(0).setName("a");처럼 team객체의 members객체에 접근하여 값을 변경하면 update 쿼리가 실행되는 이유는 어떤걸까요?두번째로 team객체와 member객체 생성하게되면 team객체에서 참조하는 members를 JPA에서 맵핑해줄거라고 생각했는데 team객체에 members는 생성된 member 객체를 참조하지 않고 em.clear및 em.find로 DB를 통해 team객체를 받아와야 members를 참조하는 구조로 되어있더라구요.JPA에서 이부분은 지원이 되지 않는 부분일까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 관련 질문입니다.
@Entity @Table(name = "ORDERS") @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "order_id", nullable = false) private Long id; @ManyToOne(fetch = FetchType.LAZY) //연관관계 주인 @JoinColumn(name = "user_id") private User user; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "delivery_id") private Delivery delivery; //배송정보 @Enumerated(EnumType.STRING) private OrderStatus status; //ORDER, CANCEL private LocalDateTime orderDate;// 주문 날짜 public Order(User user) { this.user = user; } @Builder public Order(User user, Delivery delivery, OrderStatus status, LocalDateTime orderDate) { this.user = user; this.delivery = delivery; this.status = status; this.orderDate = orderDate; } //--- 양방향 연관관계 편의 메서드 ------// 편의메서드는 컨트롤 하는 쪽에 만들어주면 됨 // 다 쪽이 연관관계 주인으로 값 의 변경사항은 주인쪽에서 함 // 다 쪽이 set // 일쪽이 add public void setUser(User user) { this.user = user; user.getOrders().add(this); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this); } public void SetDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } }중 public void SetDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } 에서 연관관계 주인은 order 이면 delivery.setOrder(this); 해도 변경사항이 데이터베이스에 반영이 안되는 것 아냐?이것도 setUser() 와 동일하게 delivery.getOrder().add(this); 해야하는 거 아닌가요?? 헷갈리는게 연관관계 주인쪽에서만 변경사항이 데이터베이스에 반영되는것으로 알고 있는데 이 말의 정확한 예시가 궁금합니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
'외부 계층으로 분리한다'는 말이 궁금합니다.
강의에서 LocalDateTime.now()를 파라미터로 받게끔 해서 분리하는 걸 예시로 들어주셨는데요.'테스트하기 어려운 영역을 외부 계층으로 분리한다'는 말씀이 위 예시처럼 파라미터로 받게끔한다는 것인가요?외부 계층이라는 말이 잘 이해되지 않아서 질문드립니다! 테스트하기 어려운 메서드를 호출하는 상위 레벨의 메서드를 외부 계층이라고 하는 것일까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
앱 배포시 jar 질문
앱을 배포하는 도중 계속 에러가 나 질문 올립니다. plugins { id 'java' id 'org.springframework.boot' version '3.0.4' id 'io.spring.dependency-management' version '1.1.0' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-security' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.mysql:mysql-connector-j' implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' implementation 'com.auth0:java-jwt:3.19.2' } tasks.named('test') { useJUnitPlatform() } 위와 같이 build.gradle 파일을 설정하였는데 ./gradlew build 시 아래와 같은 오류가 계속 뜹니다. * What went wrong:Execution failed for task ':bootJar'.> Entry META-INF/MANIFEST.MF is a duplicate but no duplicate handling strategy has been set. Please refer to https://docs.gradle.org/7.6.1/dsl/org.gradle.api.tasks.Copy.html#org.gradle.api.tasks.Copy:duplicatesStrategy for details.해결방법이 있을가요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.find 시 쿼리문 2번 수행
영속성 컨텍스트 2 강의의 약 7분 쯤 em.find를 2번하게 되어도 1차캐시 조회에 의해 쿼리문이 한번만 출력된다고 하셨는데저는 2번 출력되네요.. 문제가 뭘까요 https://drive.google.com/drive/folders/1rLlWTlGVWyFRoL-HXbvyWREnpHBC7OBe?usp=sharing 추가로 질문이 하나 더 있는데강의에서는 JPAMain 자바 파일의 try문을 수행하면 db에 바로 저장이 되는데저는 저장이 안됩니다.이것도 한번 확인 부탁드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방향,단방향 및 방향에 관해서 질문 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]저희 예제에서는 없었지만 A라는 엔티티가 있고 B라는 엔티티가 있는데 A와 B는 1대N관계라고 할때 A를 통해 B를 사용하지만 그렇다고 B로 A를 찾아가진 않습니다.(즉 A에서 B로 단방향 연관관계를 맺고 싶은 상황입니다)그런데 다 쪽(B)에 항상 외래키가 있어야하므로 @ManyToOne(JoinColumn...을 쓰면 B에서 A로 가는 방향도 자동으로 설정되는 것아닌가요?그렇게 되면 어쩔수 없이 양방향 연관관계로 사용할 수 밖에 없나요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
N+1문제
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]저번 챕터에서 나왔던 X to one 에서 n+1문제가 있어서 패치조인으로 최적화를 했었는데 이번에 X to many 문제에서 발생하는 데이터 뻥튀기 문제도 n+1문제라고 할 수 있나요?
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
AbstractAuthenticationProcessingFilter내에서 HttpServletResponse값이 안들어갑니다
@Bean public SecurityFilterChain httpSecurity(HttpSecurity http) throws Exception { return http.cors().disable() .csrf().disable() .httpBasic().disable() .formLogin().disable() .authorizeRequests().anyRequest().authenticated() .and() .addFilterAt(authFilter(), UsernamePasswordAuthenticationFilter.class) .addFilterAt(jwtFilter(), UsernamePasswordAuthenticationFilter.class) .build(); } @Bean public WebSecurityCustomizer webSecurityCustomizer() { return web -> { web.ignoring().requestMatchers().antMatchers("/h2/**"); }; } @Bean public AuthFilter authFilter() throws Exception { var authFilter = new AuthFilter(); authFilter.setAuthenticationManager(authenticationConfiguration.getAuthenticationManager()); authFilter.setAuthenticationSuccessHandler(new SimpleUrlAuthenticationSuccessHandler("/")); authFilter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler("/error")); return authFilter; }설정은 위와 같이 했습니다.@Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { super.successfulAuthentication(request, response, chain, authResult); String SECRET = "secrsdkfjhjh4243j234jh2SDdsfjhgsdfhjgjFQQQQdasd1et"; Claims claims = Jwts.claims(); claims.put("username", SecurityContextHolder.getContext().getAuthentication().getName()); String compact = Jwts.builder() .setClaims(claims) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 1시간 .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); response.addHeader("Authorization", compact); response.addCookie(new Cookie("token", compact)); }위와 같이 설정을 했는데 http 요청 테스트를 해보면 설정한 값이 하나도 들어가 있지않습니다.컨트롤러나 OncePerRequestFilter에서 값을 넣어보면 잘 적용됩니다..
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시 기능 한계로 인한 즉시로딩 질문
만약강의 17분쯤에 설명하는 프록시 객체 한계에 대해서 궁금한 부분이 있습니다. 즉시로딩이 적용되어 JOIN을 통해 Member의 값을 불러오게 되면 조회에서만 그치지 않고 Member 프록시 객체에 Injection이 추가로 되는지 궁금합니다!
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
AWS 과금 조심!
질문글은 아니지만 혹시 저처럼 AWS랑 안 친하신 분들을 위해 과금 조심하시라고 올립니다. 강의 내용에도 설명 해주시지만, 고정IP(아마존에서는 Elastic IP Addresses, 탄력적 IP라고 부르네요)를 생성하고 인스턴스를 연결 안 하거나, 연결된 인스턴스가 running상태가 아니면 하루에 0.12USD정도 나가는 것 같네요.(저는 인스턴스에 연결만 해두면 되는 줄 알고 연결된 인스턴스 꺼놨다가 요금 나갔네요ㅜ.. 수업료가 그나마 싸서 다행입니다. )AWS 강의까지 진행하시는 분들은 참고하셔서 진행하시면 좋을 것 같아요!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1편 까지 완성된 소스코드를 받을 방법이 있을까요?
2편부터 강의를 보기 시작했는데, 코드를 쳐보면서 따라가고 싶어요. 혹시 2편 내용은 없고 1편 내용까지만 완성된 코드는 어디서 받을 수 있을까요?
-
해결됨쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS
H2외의 DB를 사용할 때도 AWS에 올리는 것은 똑같은 방식으로 하나요?
강의에서는 H2를 사용하였는데 DB로 MySql, PostgreSql같이 다른 RDBMS를 사용해보려고 합니다. AWS에 올릴 경우 application.properties에 작성한 DB설정 내용과 gradle이 가져오는 라이브러리를 제외하고는 모든 것이 똑같이 하면 되는 걸까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA 소개 - 1차 캐시와 동일성 보장 에서 질문이 있습니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요, 영한님! 영한님 수업을 새겨듣고 있는 수강자입니다!다름이 아니라, JPA 소개파트의 "1차 캐시와 동일성 보장(15분 30초경)" 에서 말씀하신 동일성이 "각 Entity가 참조하는 메모리 주소가 같지 않아도 값을 통해 같음을 보장"한다는 뜻과 일맥상통한 내용인가요? Java의 equals에 대해서 공부하다가 동일성이란 단어가 동일한 의미로 쓰이는지 궁금해서 여쭈어봐요! 만약에 같은 뜻이라면, "같은 엔티티를 반환한다"는 말을 "참조하는 메모리 주소가 같지는 않고, 값만 같은 엔티티를 반환한다"로 이해해도 될까요??질문 들어주셔서 감사합니다.오늘도 좋은 하루 보내세요!!