묻고 답해요
135만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
자바 jpa 기본강의 프록시 32분 43초 부분
안녕하세요자바 jpa 기본강의 프록시 32분 43초 부분에서 강사님께서 JPA에서는 ==을 무조건 참이라고 보장해줘야한다고 하셨습니다 근데 ==을 무조건 참이라고 보장해줘야한다는 경우가 어떤상황에서일어나는 것인지 잘 모르겠습니다.강의 앞에 내용을 봐도 잘 이해가 안가서요. 같은 트랜잭션안에서인가요? 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결코드로 배우는 React with 스프링부트 API서버
router 이동 질문 드립니다.
안녕하세요. 열심히 강의 듣고 있습니다. ... react에서 router 이동에 궁금한거 잇어서 질문 드려요1root 의 라우터에는 TodoIndex와 ProductsIndex 2개의 페이지가 있습니다. ............ 생략 ..............{ path: "todo", element: ...<TodoIndex/>..., children: todoRouter() }, { path: "products", element: ... <ProductsIndex/>..., children: productsRouter() }2.TodoIndex의 child은 todoRoter이고 add의 TodoAdd와 mdify의 TodoModify가 있습니다. { path: "add", element: ...<TodoAdd/>... }, { path: "modify/:tno", element: ...<TodoModify/>... }ProductsIndex의 child은 productsRouter이고 add의 ProductList와 mdify의 ProductModify가 있습니다. 현재 ../products/add 에 있다고 했을때 add 페이지에 있는 버튼을 누르면 ../todo/add 로 점프해서 이동하려면 어떻게 navigate 해야되나요? todo/add에서 todo/modify 이런식의 같은 폴더 레벨이면 쉽게 이동되던데 ...
-
미해결Practical Testing: 실용적인 테스트 가이드
다른데 글 남기는 곳을 못찾겠어서 여기에 남겨볼게요..
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 이런 질문 해도 되는지 모르겠지만강의에서 h2콘솔 접속하실때 초기에 보여지는 웹사이트 정보좀 알 수 있을까요?개발관련 정보들이 많은것 같아서 알고싶습니다!
-
미해결코드로 배우는 React with 스프링부트 API서버
Product 컨트롤러 api 결과값 리턴 질문
상품 등록이나 수정을 하고나서return Map.of("result", "Success")이렇게 리턴해주셨는데실무에서 이런 방식을 많이 사용하나요 아니면 교육목적이기 때문에 조금 러프하게 하신건가요??이번 강의를 보고 실무와 가깝게 프로젝트를 진행하고 싶은데 이렇게 Map에 간단하게 리턴할지 아니면 api마다 매번ResponseEntity에 Http Status Code 담아 리턴해야 할지 기준을 모르겠습니다.제 목적에 맞게 하려면 어떤 방식으로 api 결과를 리턴해줘야 할까요??
-
미해결입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
org.junit.jupiter.api.extension.ParameterResolutionException: Failed to resolve parameter
테스트 코드 실행시 의존성 주입이 안되는 듯한 에러가 있습니다...org.junit.jupiter.api.extension.ParameterResolutionException: Failed to resolve parameter [com.mkim.portfolio.domain.repository.ExperienceRepository experienceRepository] in constructor [public com.mkim.portfolio.domain.repository.ExperienceRepositoryTest(com.mkim.portfolio.domain.repository.ExperienceRepository)]: Failed to load ApplicationContext for [MergedContextConfiguration@41120e48 testClass = com.mkim.portfolio.domain.repository.ExperienceRepositoryTest, locations = [], classes = [com.mkim.portfolio.PortfolioApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@15bb5034, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@34be3d80, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@854e4b26, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@7a35b0f5, [ImportsContextCustomizer@165a5979 key = [org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcClientAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7bd7d6d6, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2a8448fa, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@4d8dfd98], contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] @Autowired 도 잘 넣은듯한데 왜 해당 에러가 발생하는지를 파악을 못하고 있습니다...test를 하려하는 타겟 레포지토리도 하위 경로에 잘 존재합니다.interface ExperienceRepository : JpaRepository<Experience, Long> { fun findAllByIsActive(isActive: Boolean): List<Experience> }현재 플러그인과 디펜던시는 아래와 같습니다.plugins { id("org.springframework.boot") version "3.3.0" id("io.spring.dependency-management") version "1.1.5" kotlin("plugin.jpa") version "1.9.24" kotlin("jvm") version "1.9.24" kotlin("plugin.spring") version "1.9.24" } dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-thymeleaf") implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") runtimeOnly("com.h2database:h2") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") testRuntimeOnly("org.junit.platform:junit-platform-launcher") }제가 확인해야할 부분을 잘 못찾고 있는듯합니다... 혹시 제가 놓치는 부분이 있을까요?
-
미해결실전! Querydsl
QMemberDto는 생성되었는데 사용할 수가 없습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.QMemberDto는 정상적으로 생성되었는데 테스트 코드에서 사용하려고 하니 import가 안돼서 질문드립니다.아래는 소스코드입니다.https://drive.google.com/file/d/1PSyqZZg2S84G2hQ9QsG-FgfR6Az6kFYm/view?usp=sharing
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
"/api/v1/simple-orders" 로 포스트맨으로 get send시, 에러 발생
엔티티로 등록된 다른 클래스들도 양방향 연관관계가 있는데는 @IgnoreJson으로 한쪽씩 다 막아놨습니다.인텔리제이에서 JpashopApplication를 실행했을땐 에러가 안나는데, 실행 상태에서 포스트맨으로 send하면, 에러가 발생합니다. 어떤 부분이 문제인지를 아무리 시도해도 파악하지 못하겠습니다.에러의 주내용Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.InvalidDataAccessApiUsageException: Could not locate named parameter [name], expecting one of []] with root causeorg.hibernate.query.UnknownParameterException: Could not locate named parameter [name], expecting one of []at org.hibernate.query.internal.ParameterMetadataImpl.getQueryParameter(ParameterMetadataImpl.java:262) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]at org.hibernate.query.spi.AbstractCommonQueryContract.setParameter(AbstractCommonQueryContract.java:819) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]at org.hibernate.query.spi.AbstractSelectionQuery.setParameter(AbstractSelectionQuery.java:900) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]at org.hibernate.query.sqm.internal.QuerySqmImpl.setParameter(QuerySqmImpl.java:1258) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]at org.hibernate.query.sqm.internal.QuerySqmImpl.setParameter(QuerySqmImpl.java:140) ~[hibernate-core-6.4.1.Final.jar:6.4.1.Final]at jpabook.jpashop.repository.OrderRepository.findAllByString(OrderRepository.java:62) ~[main/:na]at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:351) ~[spring-aop-6.1.3.jar:6.1.3]at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.3.jar:6.1.3]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.3.jar:6.1.3]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765) ~[spring-aop-6.1.3.jar:6.1.3]at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-6.1.3.jar:6.1.3]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.3.jar:6.1.3]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765) ~[spring-aop-6.1.3.jar:6.1.3]at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:717) ~[spring-aop-6.1.3.jar:6.1.3]at jpabook.jpashop.repository.OrderRepository$$SpringCGLIB$$0.findAllByString(<generated>) ~[main/:na]at jpabook.jpashop.api.OrderSimpleApiController.ordersV1(OrderSimpleApiController.java:26) ~[main/:na] Servlet.service() for servlet [dispatcherServlet] threw exceptionjava.lang.ClassNotFoundException: javax.persistence.Transientjava.lang.ClassNotFoundException: javax.persistence.Transientat java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na] 파일은 여기에 올려놨습니다. https://drive.google.com/file/d/1EV5RLn2Hmw_xGOn--nnVOLRyU8JiQG9h/view?usp=sharing
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
member 객체 id 생성 관련 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]테스트를 실행할 때마다 member 객체가 초기화되고, repository에 저장이 되는데, 그럼 db에 userName=memberA로 갖는 객체가 여러 개 저장되야 하는 거 아닌가요?왜 테스트를 계속 실행해도 DB엔 userName=memberA인 객체 하나만 저장되어 있는 건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
h2 콘솔 접근 불가
위의 에러가 나옵니다 활성화도 제대로 된거 같은데 h2-console에 jdbc:h2:mem:library;MODE=MYSQL;NON_KEYWORDS=USER를 입력하고 connect버튼을 누르면 에러가 나오고 url은 초기화 됩니다. local로 돌려도 화면상에 mysql연결이 된 거 같이 데이터는 그대로 입니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 서비스 개발 할 때, 주문 상품 생성에 관해
[질문 템플릿]1. 강의 내용과 관련된 질문인가요?예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요?예[질문 내용]주문 생성 시에 매개변수로 OrderItem을 여러개 받을 수 있게 했었는데 그렇다면 주문 서비스도 ItemId를 여러 개 받게 해야 하지 않나요??
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실무에서는 테이블생성할때
지금 현재 데이터베이스 스키마 자동생성ㅇ을 보고 있는데요엔티티 클래스 만들때 이제 테이블이 자동생성이 되잖아요근데 실무에서는 이렇게 안하고 테이블 생성하고엔티티 작성하나요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
예외 날리는 이유에 대해서
안녕하세요강의 듣다가 문득 든 의문인데 코드를 짜실 때 조건이 아닌 경우에 다른처리를 하는 것이 아니라 바로 예외를 날려서 처리를 하시는데 이유가 있을까요? 혼자 짤 때는 예외처리를 하지 않고 else로 조건 분기 시켜서 따로 따로 코드 진행시키는데 바로 예외날리시는 이유가 궁금합니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa repository에서 JPQL 엔티티 리턴 관련 질문
내가 댓글 단 게시글을 조회할 때, @JPQL을 이용해서 다음과 같이 댓글 Repository에서 JPQL 사용해서 PostEntity를 반환하고 있는데, 이 방식이 혹시 문제가 있을까요? @Repository public interface CommentRepository extends JpaRepository<CommentEntity,Long> { @Query("SELECT DISTINCT c.post FROM CommentEntity c WHERE c.user.userId = :userId") Page<PostEntity> findPostByUserComment(@Param("userId") String userId, Pageable pageable); }질문은 다음 3가지 입니다.1. CommentRepository에서는 CommentEntity로만 반환하고 CommentEntity.getPost()를 통해 게시글을 가져오는 게 맞을까요? 아니면 위 코드대로 진행해도 괜찮을까요? 실무에서 선호하는 방식이 궁금합니다. 내가 댓글 단 게시글을 조회하는거니까, CommentRepository에서 메소드를 만드는 게 맞다 생각했는데 혹시 PostRepository에서 메소드를 구현하는게 더 좋을까요?만약 위 코드처럼 한다면, 다대일이기 때문에 fetch join을 추가해서 pageable 같이 써도 문제 없는게 맞을까요?
-
미해결실전! 스프링 데이터 JPA
DB,검증코드 에서는 member가 다른팀을 가지고있으나 soutv에서 같은팀을 가지고있다고 하는문제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.member = Member(id=1, username=member1, age=10)member.getTeam() = Team(id=1, name=teamA)memberList = [Member(id=1, username=member1, age=10), Member(id=2, username=member2, age=20)]member = Member(id=2, username=member2, age=20)member.getTeam() = Team(id=1, name=teamA)memberList = [Member(id=1, username=member1, age=10), Member(id=2, username=member2, age=20)]member = Member(id=3, username=member3, age=30)member.getTeam() = Team(id=1, name=teamA)memberList = [Member(id=3, username=member3, age=30), Member(id=4, username=member4, age=40)]member = Member(id=4, username=member4, age=40)member.getTeam() = Team(id=1, name=teamA)memberList = [Member(id=3, username=member3, age=30), Member(id=4, username=member4, age=40)]이부분이 soutv 프린트결과입니다.이부분부터 테스트코드인데요 여기서분명히 팀을 다르게넣어주었고 실제로 db에도 적용되어있습니다.@Test @DisplayName("entity test") void entityTest() { Team team = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(team); em.persist(teamB); Member member = new Member("member1",10,team); Member member1 = new Member("member2",20,team); Member member2 = new Member("member3",30,teamB); Member member3 = new Member("member4",40,teamB); em.persist(member); em.persist(member1); em.persist(member2); em.persist(member3); List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList(); for (Member memberList : members) { System.out.println("member = " + memberList); System.out.println("member.getTeam() = " + member.getTeam()); System.out.println("memberList = " + memberList.getTeam().getMembers()); } Assertions.assertThat(member.getTeam()).isEqualTo(team); Assertions.assertThat(member1.getTeam()).isEqualTo(team); Assertions.assertThat(member2.getTeam()).isEqualTo(teamB); Assertions.assertThat(member3.getTeam()).isEqualTo(teamB); } 어떤게 문제인지모르겠어서 질문남깁니다!entity code 도 남기겠습니다.package study.datajpa.entity; import jakarta.persistence.*; import lombok.*; @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id","username","age"}) public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; public Member(String username) { this.username = username; } public void memberTeamSetting(Team team) { if (this.team != null) { this.team.getMembers().remove(this); } this.team = team; team.getMembers().add(this); } public Member(String username, int age, Team team) { this.username = username; this.age = age; if(team != null) { memberTeamSetting(team); } } } package study.datajpa.entity; import jakarta.persistence.*; import lombok.*; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id","name"}) public class Team { @Id @GeneratedValue @Column(name = "team_id") private Long id; private String name; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>(); public Team(String name) { this.name = name; } }
-
미해결코드로 배우는 React with 스프링부트 API서버
파일 업로드 관련 질문
[파일 업로드 설정과 확인] 강의에서 DB에 아주 중요한게 아니라면 성능적인 부분때문에 DB에 파일을 저장하면 안된다고 하셨습니다. 클라우드를 이용하는게 일반적이라고 생각합니다만 한가지 궁금한게 있습니다. 만약 게시글이라는 엔티티에 대표 사진이 딱 한장 들어갈 수 있다고 한다면 아래와 같은 순서로 구현할 수 있겠다는 생각이 들었습니다. 이런 방법에 대해 어떻게 생각하시나요?? 애플리케이션 단에서 이미지 등록 -> 이미지 base64 인코딩 -> 인코딩 된 긴 문자열을 압축 -> 압축된 문자열을 RDB(MYSQL) 게시글 테이블에 게시물 대표이미지 (longtext 형)에 저장.조회할때는 애플리케이션 단에서 별도로 압축된 문자를 원래 인코딩 된 문자열로 디코딩하는 로직 필요하겠지만 비용이 크지 않다고 생각했습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의자료 제공 문의
결재후 강의를 수강중입니다.보니, 강의자료 제공이라고 써 있는데, 어떻게 받을 수 있나요.Gracias!!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컨트롤러에서 호출하는 서비스 질문드립니다.(+더티체킹)
안녕하세요 항상 양질의 강의 해주셔서 먼저 감사드립니다. 현재 코드 작성 중에 어떤게 더 나은 방법인지 궁금해서 문의드립니다.카드 충전하는 서비스가 있다고 가정하면 컨트롤러를 통해 카드 충전 서비스를 호출할 예정입니다.class Controller { private final ChargeService chargeService; void charge() { chargeService.charge(); } }위와 같이 충전 진행 시, 내부에서는 카드를 찾고 외부 API를 통해 충전을 진행 후 더티체킹을 통해 카드 상태를 업데이트 할 예정입니다.class ChargeService { private final CardFindService cardFindService; private final ChargeHistoryService chargeHistoryService; void charge() { var card = cardFindService.findCard(); cardApiService.charge(); // 외부 API 호출 chargeHistoryService.save(); // 충전 내역 저장 card.updateStatus(); // 카드 상태 변경 } }여기서 궁금한게 충전을 진행하는 ChargeService 내에서 더티체킹을 통해 카드의 상태를 업데이트 하는게 좋을지, 아니면 컨트롤러단에서 ChargeService와 CardUpdateService를 각각 호출해주는게 좋을까요?class Controller { private final ChargeService chargeService; private final CardUpdateService cardUpdateService; void charge() { chargeService.charge(); cardUpdateService.updateCardStatus(); } }OSIV를 꺼둔 상태에서 진행 시 chargeService 내 하나의 트랜잭션 내에서 충전 내역과 카드 상태까지 업데이트를 하는게 편리해 보이긴 하지만, chargeService 내에서 카드의 상태를 업데이트하는 역할까지 주어지는 것 같아 고민이 됩니다. 만약 서비스 2개를 각각 호출하게 되면 cardFind도 각 서비스 내에서 1회 씩 총 2번 호출되는 점도 마음에 걸립니다.이와 같은 상황에서는 어떤 방식이 실무에 더 적합하고 좋을지 의견 부탁드리겠습니다.감사합니다.
-
해결됨실전! Querydsl
yaml profiles 인식이 안 됩니다 ㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에 나온 내용대로 아래 처럼도 해 보고spring: profiles: active: local검색해서 나온대로 아래처럼도 해보았는데,spring: config: activate: on-profile: local오류도 뜨지 않고 콘솔에는 insert 쿼리가 아예 뜨지 않습니다 ㅠ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
yml 과 properties의 차이가 큰가요?
현재 MemberRepository test를 진행하고 있습니다.데이터베이스 같은 경우는 mysql로 진행을 하고 있습니다.properties를 사용할 경우에는 테스트가 성공적으로 진행되는데 yml로 테스트를 진행할 경우 jdbc에서 dialect를 인식하지 못하거나 BeanCreationException 오류가 생깁니다. 분명 둘다 시스템 설정을 저장하는 파일인데 왜 이런 차이가 생기나 궁금해서 질문 남깁니다
-
미해결실전! 스프링 데이터 JPA
UsernameOnlyDto 에서 오류가 발생합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]클래스로 할때 오류가 납니다 ㅠㅠUsernameOnlyDtopackage study.datajpa.repository; public class UsernameOnlyDto { private final String username; public UsernameOnlyDto(String username) { this.username = username; } public String getUsername() { return username; } } MemberRepositoryList<UsernameOnlyDto> findProjectionByUsername(@Param("username") String username);Test @Test public void projections() { // given Team teamA = new Team("teamA"); em.persist(teamA); Member m1 = new Member("m1", 0, teamA); Member m2 = new Member("m2", 0, teamA); memberRepository.save(m1); memberRepository.save(m2); em.flush(); em.clear(); //when List<UsernameOnlyDto> result = memberRepository.findProjectionByUsername("m1"); for (UsernameOnlyDto usernameOnlyDto : result) { System.out.println("usernameOnlyDto = " + usernameOnlyDto); } //then }오류내용java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@66450129 testClass = study.datajpa.repository.MemberRepositoryTest, locations = [], classes = [study.datajpa.SpringDataJpaApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@28f2a10f, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@56cdfb3b, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@35aea049, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@7c24b813, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@485966cc, org.springframework.boot.test.context.SpringBootTestAnnotation@b5608ce], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]