묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
orderItem 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 강사님 강의 정말 잘 듣고있습니다. package jpabook.jpashop.domain; import jakarta.persistence.*; import jpabook.jpashop.domain.item.Item; import lombok.Getter; import lombok.Setter; import static jakarta.persistence.FetchType.*; @Entity @Getter @Setter public class OrderItem { @Id @GeneratedValue @Column(name = "order_item_id") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "item_id") private Item item; @ManyToOne(fetch = LAZY) @JoinColumn(name = "order_id") private Order order; private int orderPrice; private int count; //==비즈니스 로직==// public void cancel() { getItem().addStock(count); } public int getTotalPrice() { return getOrderPrice() * getCount(); } }비즈니스 로직인 cancel()과 getTotalPrice()에 대한 질문인데요 한쪽은 getter을 사용했고 다른 한쪽은 그냥 필드값을 넣었는데 혹시 이렇게 차이가 생기는 이유가 있을까요 ? getTotalprice는 getter로 orderprice와 count를 가져오지만 cancel에서는 그냥 count 필드값을 쓰는데의 차이점이 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
@RestControllerAdvice 와 @Validation
안녕하세요 선생님 좋은 강의 잘 듣고 있습니다!다름이 아니라 Validation과 ControllerAdvice에대해 질문이 있습니다. 컨트롤러 테스트 할 때 빈 validation이 적용 된 모든 필드를 하나씩 모두 검증 하나요?컨트롤러에서 request 필드가 많아서 하나씩 검증 하기엔 너무 테스트가 길지 않을까 고민 됩니다.실무에서도 컨트롤러의 모든 필드를 검증 하나요? 공통 예외 처리는 어떻게 하는게 좋을까요? @RestControllerAdvice를 basePackages 설정 하여 처리 하고 있습니다. 예상치 못한 예외의 경우가 생길것을 대비 하여 basePackages가 없는 advice를 두었습니다. 이렇게 하니 우선 순위가 밀려서 GeneralAdvice가 먼저 선택되어 Order로 우선순위 설정 해두었습니다. 처리 못한 예외를 각 advice에 넣자니 다른 advice도 코드가 중복 될것 같아 이렇게 처리 했는데 실무에서는 어떻게 처리 하시는지 궁금 하여 질문 남깁니다.!
-
미해결Spring Boot를 활용하여 채팅 플랫폼 만들어보기
MySQL을 미리 설정을 해놔야할까요?
start.sh 하는데 계속 jpa에서 연결하는 데 문제가 있는거 같아서요.혹시 이를 세팅하는 부분이 다른 강의에 있는것일까요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@Transactional이 어디에 적용되어 있는지 스프링은 매번 조사하는 건가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@Transactional 적용 우선순위가 1. 클래스의 메서드2. 클래스의 타입 3. 인터페이스의 메서드 4. 인터페이스의 타입 이 순서라고 하셨으니 클래스의 메서드에 @Transactional이 없으면 클래스의 타입을 확인하고, 그래도 없으면 인터페이스의 메서드를 확인하고, 그래도 없으면 인터페이스의 타입에 @Transactional이 있는지 없는지 확인하는 거로 이해했는데 스프링 프레임워크를 사용하면 이를 항상 적용하나요?이전에 스프링 핵심 원리 기본 편, MVC 1, 2 강의에서 작성한 코드들엔 @Transactional을 적용하지 않았었는데, @Transactional이 코드 어디에도 없더라도 매번 스프링이 이렇게 @Transactional이 어디에 있는지 조사하나요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
프론트 코드 부탁드립니다!
안녕하세요 강의 잘듣고있습니다! 프론트 코드도 확인해보면서 공부하고싶어서 프론트 코드 부탁드립니다. backendgoat0915@gmail.com 이 이메일로 보내주시면 감사드리겠습니다. 감사합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
actuator 적용이 아닌 따로 `/heath_check` 를 생성한 이유가 있을까요?
actuator 적용이 아닌 따로 /heath_check 를 생성한 이유가 있을까요? 좋은 강의 감사합니다. 좋은 하루 보내세요 : )
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.getTransaction하면
10분쯤에em.getTransaction()을 하면 자동으로EntityTransaction transaction = em.getTransaction();이게 나오는 것 같은데 저는 안 나오더라구요어떻게 저게 자동으로 나오는건가요?
-
미해결실전! Querydsl
Query dsl 에서 QHello 생성안됨
plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' } group = 'study' 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' implementation 'org.springframework.boot:spring-boot-starter-web' 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' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta") annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } clean { delete file('src/main/generated') } tasks.named('test') { useJUnitPlatform() }위와 같이 build.gradle 작성했고 clean 후 compile.Java ( compile.Querydsl이 없음) 했지만 아무것도 생기지 않습니다.구글링 해서 다 적용해봐도 안되는데 어떻게들 하셨나요
-
미해결Practical Testing: 실용적인 테스트 가이드
spring security @AuthenticationPrincipal rest docs 질문
안녕하세요 강사님강의를 굉장히 잘 들었던 수강생입니다. 다름이 아니라 최근 spring security 를 도입하고 난 뒤에 rest docs 에 대해 문제가 생겨 질문하게 되었습니다.'회원 정보 조회' 라는 API 가 있고, 이 API 는 로그인을 한 뒤에 securityContextholder 에 담겨져 있는 객체를 사용하고자 파라미터로 @AuthenticationPrincipal 이라는 어노테이션을 이용하여 받고 있습니다.그러나...restdocs 를 이용하여 해당 API 를 문서화 시키려고 할때 객체가 null 이 들어가서 테스트가 실패를 하게 되더라구요.docs 가 아닌 일반 controller test 에서는 @SpringBootTest 를 사용하여 @WithUserDetails 를 통해 테스트를 통과했습니다.그러나 @SpringBootTest 를 따로 사용하고 있지 않은 상황에서 어떻게 해결할 수 있을지 고민입니다 ㅠㅠ감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
알맞은 버전 확인 방법
9분에서Reference Doc 들어가서 hibernate 검색하면 스프링부트와의 알맞은 버전이 나온다고 하셨는데, 저는 안 나오네요. 지금은 방법이 바뀌었나요? 적합한 버전을 어떻게 찾나요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
26강 updateUser request id값이 안들어옵니다.
private final UserServiceV2 userService;jpa로 설정한 이후 putMapping에서 id값이 0으로만 들어옵니다.코드는 json원시값보고싶어서 httpRequest 로 테스트한 상황입니다.(로그는 Raw JSON Body: {"id":0,"name":"333"}) db 데이터, 등록, 삭제 모두다 잘동작하고 id만 client에서 받아오질 못하는 것 같습니다. postman으로 json값 정상적으로 요청하면 작동도 잘되구요.UserServiceV1 인 jdbctemplate를 이용한 방식도 파라미터 정상적으로 넘어와서 잘동작합니다.이유를 모르겠습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Gateway `_(언더바)` Internal Server Error
안녕하세요. 강의 잘 보고 있습니다. Gateway의 uri를 lb://MY_FIRST_SERVICE 로 수정했을 때 500 Internal Server Error가 났습니다.처음에 Spring boot 버전에서 문제인가 싶어서 Spring boot 버전을 3.3.5 -> 3.2.0 으로 수정도 해보고 load-balancer도 추가해보고 했습니다. 결과적으로 lb://MY_FIRST_SERVICE의 _(언더바)를 -하이픈으로 수정하니 정상 작동하는 것을 알았습니다. 그런데 여기서 이유를 GPT에게 물어본 결과라는 답변을 받았습니다.이러한 결과가 사실이 맞는지 궁금합니다. 구글링 해봤을 때 관련한 자료는 없어서 여쭤봅니다
-
미해결실전! Querydsl
querydsl 처음 설정 후 테스트코드 돌려보는데 오류 원인을 모르겠어요
JPAQueryFactory queryFactory = new JPAQueryFactory(em);부분에서Cannot resolve constructor 'JPAQueryFactory(EntityManager)'오류가 생기는데 원인을 모르겠어요아래는 현재 설정입니다.스프링 생성 build.gradle 소스plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'study' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' //querydsl 추가 implementation 'com.querydsl:querydsl-jpa' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa' implementation 'mysql:mysql-connector-java:8.0.33' // MySQL 드라이버 최신 버전 사용 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' // 쿼리 파라미터 로그 표시 (성능에 영향을 줄 수 있음) // runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } //querydsl 추가 끝 테스트코드package study.querydsl; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import study.querydsl.entity.Hello; @SpringBootTest @Transactional class QuerydslApplicationTests { @Autowired EntityManager em; @Test void contextLoads() { Hello hello = new Hello(); em.persist(hello); JPAQueryFactory queryFactory = new JPAQueryFactory(em); // QueryDSL 쿼리 테스트 } }
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
spring cloud gateway mvc 모델에서 route별 timeout 설정
안녕하세요 선생님. 질문이 있어 남깁니다.spring cloud gateway mvc모델에서 route별 httpclient의 readtimeout, connectiontimeout을 설정하는 방법이 있나요?reactive한 모델에서는 metadata를 이용하여 설정하는 것 같은데, documents를 아무리 뒤져도 mvc모델에서 전역적으로 타임아웃 설정하는 법만 있고, route별 설정하는 법이 없네요.. 어떻게 설정해야할까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의자료를 얻고 싶습니다.
강의 자료를 받아 보고 싶습니다.필요한 것을 찾을 때 강의를 재생하면서 내용 중에 찾기가 힘들어요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
[JPA와 DB 설정, 동작확인] 왜 insert가 안되는지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, 테스트가 정상적으로 실행되었으며 @Rollback 어노테이션을 붙였음에도 불구하고 왜 데이터가 insert 되지 않는지 궁금합니다.관련 사진은 다음과 같습니다. 코드는 다음과 같습니다.package jpabook.jpashop; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @RunWith(SpringRunner.class) @SpringBootTest class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) public void testMember() throws Exception { // given Member member = new Member(); member.setUsername("memberA"); // when Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); // then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } }spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: update properties: hibernate: #show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug #org.hibernate.type: trace 감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Import
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 전 강의에서 @Configuration 파일은 하나의 파일에서 대부분 설정 한다고 하셨던거 같은데 @Import 를 사용하면 설정파일도 분리해서 사용 하는경우도 있을까요 ? 예를 들면 DB 부분, 인증부분 등등 .. 좀 큰 프로잭트에서 사용하는 방법인지 궁금합니다!
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
공식 문서 링크가 바뀐 것 같습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]6. 데이터 접근 기술 - 스프링 데이터 JPA.pdf (v20240526) 4페이지에 나온 두 링크를 눌러도 주소가 바뀌어서 원래 페이지로 이동하지 않습니다. https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html#jpa.query-methods.query-creation https://docs.spring.io/spring-data/jpa/reference/repositories/query-methods-details.html#repositories.limit-query-result 이 링크로 바뀐 것 같습니다.
-
미해결실전! 스프링 데이터 JPA
이런 상황에선 어떻게 구현 하시는 지 궁금합니다.
안녕하세요. 좋은 강의 항상 감사합니다.JPA 와 디비를 배우면서 적용 하는 과정에서 궁금한게 생겼습니다. @Transactional public Post getPostDetail(Long postId) { Post post = postRepository.findById(postId) .orElseThrow(() -> new CustomException(ErrorCode.POST_NOT_FOUND)); post.incrementViewCount(); // 조회수 증가 return post; }상세글 조회 시 조회수가 +1 되는 간단한 로직을 가정하겠습니다.트래픽이 크다고 가정 할 시 해당 로직 대로 하면 조회 시 마다 DB에 부하가 예상되서 질문 드립니다. 해당 로직대로 해도 DB에 크게 부하를 주지 않는 수준인가요?Redis를 써서 조회수 만 따로 캐시로 저장을 한다면 DB랑 데이터가 정합하지 않을 것으로 예상됩니다. 만약 조회수가 중요한 서비스라면 db 락을 이용하여 성능 저하를 감안 하고 하시는지..실무에선 어떻게 처리하시는 지 궁금합니다
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
querydsl Q class 이슈
plugins { id 'java' id 'org.springframework.boot' version '3.0.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "org.asciidoctor.jvm.convert" version "3.3.2" } group = 'org.spring' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } asciidoctorExt } repositories { mavenCentral() } ext { snippetsDir = file('build/generated-snippets') } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.security:spring-security-crypto' implementation 'org.springframework.session:spring-session-jdbc' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.security:spring-security-test' implementation 'org.bouncycastle:bcprov-jdk15on:1.70' implementation 'com.querydsl:querydsl-core:5.0.0' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor 'jakarta.persistence:jakarta.persistence-api' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' implementation 'io.jsonwebtoken:jjwt-api:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" asciidoctorExt "org.springframework.restdocs:spring-restdocs-asciidoctor:3.0.0" testImplementation "org.springframework.restdocs:spring-restdocs-mockmvc:3.0.0" annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly "org.projectlombok:lombok" testAnnotationProcessor "org.projectlombok:lombok" runtimeOnly 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.modelmapper:modelmapper:3.2.0' } tasks.named('test') { useJUnitPlatform() } test { outputs.dir snippetsDir } asciidoctor { inputs.dir snippetsDir configurations 'asciidoctorExt' dependsOn test } asciidoctor.doFirst { delete file("src/main/resources/static/docs") } bootJar { enabled = true dependsOn asciidoctor copy { from asciidoctor.outputDir into "src/main/resources/static/docs" } } jar { enabled = false } FAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':compileJava'.> Compilation failed; see the compiler error output for details.* Try:> Run with --info option to get more log output.> Run with --scan to get full insights.BUILD FAILED in 6s 안녕하세요querydsl 빌드 후 Q class 임포트 하는 곳에서 에러가 발생합니다 ㅠ구글링해서 이런 저런 방법 찾아서 혼지사 해보려고 했는데 쉽지않네요.. 그 밖에 캐시 지우고 재시작, java SDK 설정, 빌드설정 등 여러가지 방법을 해보았는데 잘 안됩니다 ㅠ두세시간 정도 삽질중인데 도움 좀 주실 수 있을까요..