inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

h2 database에 member 테이블이 생성되지 않아요

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 네, jpa와 db 설정, 동작 확인 동영상 입니다. 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니요. 있는 내용인데 찾아보고 해결하지 못했습니다. 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네 [질문 내용] 여기에 질문 내용을 남겨주세요. 테스트 코드 실행 시 member 테이블이 생성되지 않습니다. ddl 설정은 create이고, 관련 설정 확인해도 못찾아서 문의 드려요. 테스크 코드 맨 마지막에 로그를 찍어놨는데, 해당 로그가 찍히고 이 뒤에 테이블이 왜 drop될까요? 도저히 모르겠습니다...ㅎ https://drive.google.com/file/d/1WT3dZ7HexApj0xAYZsFJSkKVpaSmGEFM/view?usp=sharing 구글 드라이브 프로젝트 첨부 드립니다.

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
blessthy 댓글 1 좋아요 0 조회수 132

파이썬질문

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

6분에있는 출력값중에 1,2,3출력값앞에 어떤이유로 dict_keys,dic_values,dict_items이런 이름이 붙는지 궁금합니다. 어떤규칙성을 가지나요?

  • python
  • java
  • c
  • 정보처리기사
alsrb4367 댓글 2 좋아요 0 조회수 54

빈에 대한 질문

해결됨

토비의 스프링 6 - 이해와 원리

안녕하세요. 제가 빈에 대해 정리한 문장에 대해 교정 부탁드립니다. 빈은 스프링 컨테이너(즉, 스프링)에 의해 관리되는 객체이다. 관리라는 것은 객체의 생성부터 의존성 주입 등 기존 프로그래머가 해줘야 했던 작업을 스프링이 해 주는 것이다. 즉 스프링 빈은 제어의 역전의 주 대상이다. 내가 작성한 클래스의 객체의 제어권을 스프링에게 넘겨주려면, 그 객체를 반환하는 멤버함수를 작성해서 @Bean을 붙여준다. 멤버함수가 소속된 클래스에는 @Configuration을 붙여서, 이 클래스의 멤버함수는 빈을 반환한다고 스프링에게 선언한다. 빈이라는 개념이 참 햇갈리네요. 식견이 짧아 저 정도밖에 이해를 못하겠습니다. 틀린 부분 교정 부탁드립니다.

  • java
  • spring
윤휘영 댓글 1 좋아요 0 조회수 114

c언어 포인터에대해서 질문입니다

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

int arr[] = {10, 20, 30,40,50}; int *p = arr; printf("%d", *p++); printf("%d", (*p)++); printf("%d", ++(*p)); printf("%d", *++p); printf("%d", ++*p); 다음과같이 포인터가 존재한다면 어떻게 출력이 되는지와 그 이유를 알 수 있을까요?

  • python
  • java
  • c
  • 정보처리기사
alsrb4367 댓글 2 좋아요 0 조회수 89

기출 질문

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

이번 1회 시험봤는데 53점으로 아쉬운듯 아쉽지 않게 떨어져서 1회 기출을 계속 풀어보기 위해 결제한 사람입니다. 어디에도 1회를 복원하고, 제대로 풀어주는 분이 주말코딩님 밖에 없더라고요ㅠ 1회 끝나고 2달 만에 공부하는데 지난 기출들은 계속 풀어보면서(좀 까먹어서,,) 1회 문제들만 집중적으로 풀면 될까요?? 어떻게 하는게 좋을까요?

  • python
  • java
  • c
  • 정보처리기사
이동근 댓글 2 좋아요 0 조회수 168

전에 말씀드린 정답을 제외한 기출문제들

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

전에 말씀드린 정답을 제외한 기출문제들 묶음에 대해서 언제쯤 올라오는지 궁금합니다. 정보처리기사 2회시험이 한달도 남지않아서요....

  • python
  • java
  • c
  • 정보처리기사
alsrb4367 댓글 2 좋아요 0 조회수 60

안녕하세요 8장 학습하다 궁금한게 있어 질문드립니다.

미해결

웹에서 다루는 미디어 - 화상 대화를 만들면서 배우는 MediaStream API

안녕하세요, 선생님! 8장 강의 학습 중에 궁금한 부분이 있어 이렇게 질문드립니다. 8장 실습 중 WebRTC 관련 예제를 크롬에서 먼저 실행한 뒤, 익스플로러 엣지에서 실행했더니 첨부한 이미지와 같은 현상이 발생했는데요, 혹시 이 경우가 왜 발생하는 건지 조언 구드려도 될까요? 강의 덕분에 많은 걸 배워가고 있습니다. 무더운 여름 건강 유의하시고, 감사합니다!

  • react
  • java
  • web-api
  • websocket
  • webrtc
이경용 댓글 2 좋아요 0 조회수 141

좋아요 락 api test 에서 count 가 0으로 찍혀요

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

코드가 잘못 된 부분은 없는거 같은데 count=0으로 다 찍히네요

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
댓글 2 좋아요 0 조회수 93

Producer/Consumer 단위

해결됨

RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기

학습중 궁금한 것은 언제든 문의 하세요. 질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다. 추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. 저만 궁금한 걸 수 있는데, 예를들어 Producer가 두개일 때 이 경우는 스프링 애플리케이션의 publish하는 두개의 스레드를 의미하는 건지... 애플리케이션 두 개를 의미하는 건지... 아니면 커넥션 두개를 의미하는 건지... 무엇을 기준으로 Producer/Consumer 단위를 세는건지 아시나요 ?

  • java
  • spring-boot
  • jpa
  • msa
  • websocket
  • rabbitmq
댓글 2 좋아요 0 조회수 79

업캐스팅질문

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

예를들어 업캐스팅 상태인데 부모클래스에 생성자 자체가 없고 자식클래스 생성자에서도 super를 안한상태라면 에러가 나야하는게 아닌가요?

  • python
  • java
  • c
  • 정보처리기사
ddeji99 댓글 2 좋아요 0 조회수 72

JAVA언어 기출문제의 변형

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

19분에 나오는 자식 생성자 질문드립니다. 업캐스팅이 아닌 형태에도 생성자를 호출할때 부모 먼저 호출갈까요? child obj = new child() Parent obj = new child() 둘다 마찬가지로 부모먼저할까요? Parent obj = new parent() 이 경우는 부모만 하고 끝날까요?

  • python
  • java
  • c
  • 정보처리기사
박기정 댓글 2 좋아요 0 조회수 75

mapprd by질문이요

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 1대1매핑에서 주인과 종속 테이블의 개념이 모호해질수도있는데 mapprd by는 어느쪽에 적어도 상관없나요?

  • java
  • jpa
성문 댓글 1 좋아요 0 조회수 60

Kotlin 에서 JPA Entity 생성시 질문

해결됨

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

안녕하세요. 토비님! 현재 저는 강의 내용을 Kotlin springboot 로 따라가고 있습니다. JPA Entity 클래스를 생성할 때, 자바에선 롬복까지 이용해서 Getter 만 만들어놓고 setter 는 닫아놓는 게 쉽게 되는데, 이걸 코틀린에서는 롬복을 사용하지 않다보니 코틀린스러우면서도 깔끔하게 사용하는 방법에 대해서 애를 먹고 있습니다. 찾아보니 3가지 방법 있는 것 같습니다. 방법1. 자바랑 가장 비슷하게, 필드를 모두 private 으로 생성하고 getter 는 롬복 대신 직접 선언. @Entity open class Member( @Column(name = "email", unique = true, nullable = false) private var email: String, @Column(name = "nickname", nullable = false) private var nickname: String, @Column(name = "passwordHash", nullable = false) private var passwordHash: String, @Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) private var status: MemberStatus = MemberStatus.PENDING, ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L fun getEmail(): String = email fun getNickname(): String = nickname fun getPasswordHash(): String = passwordHash fun getStatus(): MemberStatus = status } 방법2. getter 를 좀 더 코틀린스럽게 사용하기 위해 내부 필드를 _를 붙여서 선언 @Entity class Member2( @Column(name = "email", unique = true, nullable = false) private var _email: String, @Column(name = "nickname", nullable = false) private var _nickname: String, @Column(name = "passwordHash", nullable = false) private var _passwordHash: String, @Enumerated(EnumType.STRING) @Column(name = "status", nullable = false) private var _status: MemberStatus = MemberStatus.PENDING, ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L val email: String get() = _email val nickname: String get() = _nickname val passwordHash: String get() = _passwordHash val status: MemberStatus get() = _status } 방법3. protected set 사용 @Entity open class Member3( email: String, nickname: String, passwordHash: String, status: MemberStatus = MemberStatus.PENDING, ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L @Column(name = "email", unique = true, nullable = false) var email: String = email protected set @Column(name = "nickname", nullable = false) var nickname: String = nickname protected set @Column(name = "passwordHash", nullable = false) var passwordHash: String = passwordHash protected set @Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) var status: MemberStatus = status protected set } 방법4(?). 전부 public val 로 선언하고, 변경시 새로운 객체 생성 @Entity @Table(name = "members") class Member4( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L, @Column(name = "email", unique = true, nullable = false) val email: String, @Column(name = "nickname", nullable = false) val nickname: String, @Column(name = "passwordHash", nullable = false) val passwordHash: String, @Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) val status: MemberStatus = MemberStatus.PENDING, ) { fun updateNickname(newNickname: String): Member4 { require(newNickname.isNotBlank()) { "Nickname cannot be blank" } return Member4( id = this.id, email = this.email, nickname = newNickname, passwordHash = this.passwordHash, status = this.status, ) } } 어느 방식을 선택하는게 현명할까요? 토비님은 평소에 어떻게 하시는지 궁금합니다.

  • java
  • spring
  • spring-boot
  • jpa
  • 리팩터링
  • ddd
woonge 댓글 2 좋아요 1 조회수 585

12:40 printEven 자바 문제 if문

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

저번에 반복문 설명하실때 if문은 if ~ (if가 아닐때)else if ~ (else if도 아닐때)else 로 끝마친다고 하셨는데, else if로 끝내든 else로 끝내든 문법적으로는 상관이 없는 건가요??

  • java
  • 정보처리기사
메리 댓글 1 좋아요 0 조회수 54

application.yml driver-class-name 연결오류

해결됨

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

spring: datasource: # 데이터의 원천 spring이 어떤 데이터를 가르키냐 url: "jdbc:mysql://localhost/library" #스프링이 붙을(연결할) 데이터베이스의 주소 #jdbc- java database conenncter 말그대로 자바가 데이터베이스에 연결할수있게해주는 프로그램 #이때 데이터종류는 mysql이고 데이터베이스는 우리 컴퓨터 localhost에있다. 그리고 사용할데이터베이스는 library이다. username: "root" password: "비밀번호" driver-class-name: com.mysql.cj.jdbc.Driver #데이터베이스에 접근할 때 사용할 프로그램 위와 같이 코드를 작성했는데 인텔리제이 얼티메이트를 사용하고 있는데도 com.mysql.cj.jdbc.Driver클릭이 안돼서 뭔가 이상하다 싶었는데 다른 질문들 답변을 보니 잘될수도 있다해서 일단 인강 코드대로 따라 갔습니다. 그런데 api를 전부 수정하고 서버를 동작하려고하니 mysql연결이 안된다는 오류와 함꼐 서버 실행이안돼서 질문 남깁니다..! plugins { id 'org.springframework.boot' version '2.7.6' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' runtimeOnly 'com.h2database:h2' runtimeOnly 'mysql:mysql-connector-java' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } 위처럼 그래들파일에도 runtimeOnly 'mysql:mysql-connector-java:8.0.42' 이코드가 잘 있는데 안되는것같습니다. 다른답변들 참고해서 위처럼 자바 버전을 붙이고 캐시지워서 리스타트한다음 다시 서버 켜봐도 안돼서 질문남깁니다..!

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
backendgoat0915 댓글 2 좋아요 1 조회수 97

테스트 간헐적 실패에서 대해서 다루나요?

해결됨

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

안녕하세요 섹션5 코드 다듬기까지 들은 시점에서 테스트 코드를 여러번 실행했을때 간헐적으로 실패를 경험합니다 혹시 해당 내용 수정하는 부분이 끝까지 들으면 나오나요 아래 에러내용 삽입했습니다. Failed to resolve parameter [com.clean.splearn.application.provided.MemberFinder memberFinder] in constructor [com.clean.splearn.application.provided.MemberFinderTest(com.clean.splearn.application.provided.MemberFinder,com.clean.splearn.application.provided.MemberRegister,jakarta.persistence.EntityManager)]: Failed to load ApplicationContext for [WebMergedContextConfiguration@350ec690 testClass = com.clean.splearn.application.provided.MemberFinderTest, locations = [], classes = [com.clean.splearn.SplearnApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@476fe690, 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@6dd1c3ed, [ImportsContextCustomizer@49cb1baf key = [com.clean.splearn.SplearnTestConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7fdab70c, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@a451491, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@2aff9dff, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@15639440, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@cbfbc3c], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] org.junit.jupiter.api.extension.ParameterResolutionException: Failed to resolve parameter [com.clean.splearn.application.provided.MemberFinder memberFinder] in constructor [com.clean.splearn.application.provided.MemberFinderTest(com.clean.splearn.application.provided.MemberFinder,com.clean.splearn.application.provided.MemberRegister,jakarta.persistence.EntityManager)]: Failed to load ApplicationContext for [WebMergedContextConfiguration@350ec690 testClass = com.clean.splearn.application.provided.MemberFinderTest, locations = [], classes = [com.clean.splearn.SplearnApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@476fe690, 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@6dd1c3ed, [ImportsContextCustomizer@49cb1baf key = [com.clean.splearn.SplearnTestConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7fdab70c, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@a451491, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@2aff9dff, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@15639440, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@cbfbc3c], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] at java.base/java.util.Optional.orElseGet(Optional.java:364) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@350ec690 testClass = com.clean.splearn.application.provided.MemberFinderTest, locations = [], classes = [com.clean.splearn.SplearnApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@476fe690, 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@6dd1c3ed, [ImportsContextCustomizer@49cb1baf key = [com.clean.splearn.SplearnTestConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7fdab70c, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@a451491, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@2aff9dff, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@15639440, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@cbfbc3c], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) at org.springframework.test.context.junit.jupiter.SpringExtension.getApplicationContext(SpringExtension.java:351) at org.springframework.test.context.junit.jupiter.SpringExtension.resolveParameter(SpringExtension.java:337) ... 3 more

  • java
  • spring
  • spring-boot
  • jpa
  • 리팩터링
  • ddd
코틀린자바 댓글 3 좋아요 0 조회수 228

JPA Entity Class 와 Domain Model Entity Class 를 분리해야 하는가? 에 대한 추가 질문

해결됨

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

안녕하세요. 토비님! 먼저 제가 정말 오랜 기간 고민해온 주제에 대해서 이렇게 강의를 내주셔서 너무 감사드립니다!! 특히 강의에서 여러 차례에 걸쳐서 깊게 다룬, "JPA Entity Class 와 Domain Model Entity Class 를 분리해야 하는가?" 에 대한 토비님의 의견이 너무 공감되고 유익했습니다! 감사합니다! 그리고 이에 대해서 두 가지 질문이 있습니다. 첫 번째는, 저는 사실 지난 3년 간 스타트업에서 Domain Entity 와 JPA Entity 를 분리해서 사용해왔습니다. 그런데 강의에서 다뤄주신 내용이 제가 겪으며 갖게 된 생각과는 결이 조금 다르다고 느껴서 이렇게 질문을 드리게 되었습니다. 제가 느꼈던 "Domain Entity 와 JPA Entity 를 분리해서 사용했을 때의 장단점"은 이랬습니다. 장점 1. 도메인 모델의 수정이 DB 데이터 마이그레이션을 꼭 강제하는 게 아니라서, 도메인 모델 수정이 매우 자유롭습니다. 상황에 따라 의도적으로 JPA Entity 클래스와 도메인 모델 클래스를 다른 모양으로 만들어두고 유지할 수 있습니다. (ex. User, UserDetail 이 쪼개져 있었는데, 어떠한 의사결정으로 인해 User 하나로 합쳐서 관리하는게 맞다는 판단이 든 경우, UserEntity, UserDetailEntity 는 놔둔 채로 User 만 합치는 게 가능.) 장점 2. 도메인 모델들을 완전히 정규화된 구조 로 가져갈 수 있습니다. 회사에서 비즈니스가 발전하다보면 종종 어쩔 수 없이 테이블에 성능을 위한 반정규화 필드나 soft delete 용 deleted_at 필드 등을 넣게 됩니다. 하지만 사실 이런 필드들은 순수 비즈니스 로직을 기술하는데에는 방해가 될 뿐인, 너무 Technical 한 부분들입니다. 이러한 반정규화 or 기능 필드들을 도메인 모델에는 넣지 않고 JPA Entity 에만 넣어서 어댑터에서 처리하면, 도메인 모델 내에서는 항상 순수 비즈니스 로직만을 기술할 수 있게됩니다. 단점 1. JPA 의 lazy loading 을 활용할 수 없습니다. 항상 도메인 모델 객체는 완전한 상태로만 존재합니다. 그래서 성능 문제로 CQRS 패턴이 강제됩니다. 특히 저는 GraphQL 을 사용중이라 더욱 더 CQRS 가 필요했습니다. 단점 2. Repository 의 save(= upsert) 로직을 직접 구현해야 합니다. 특히 복잡한 비즈니스의 핵심 도메인 모델들은 관계된 테이블도 많아가지고 이 save 구현이 엄청나게 길어집니다. 저는 이 save 로직을 직접 구현하고 관리할 때 회의감이 가장 많이 들었습니다. Spring Data JPA 가 그 동안 얼마나 압도적인 생산성을 제공해주고 있었는지도 느끼게 됐습니다. 저는 스타트업에서 일하고 있다보니 특히 생산성을 중요하게 생각합니다. 그런 점에서도 위의 장점들과 단점들이 모두 너무 치명적으로 느껴졌습니다. 그래서 이 관점들에 대한 토비님의 의견과 토비님이 제 상황이시라면 어떤 선택을 하셨을지가 너무너무 궁금합니다. (참고로 저는 Kotlin Springboot + Spring Data JPA + Kotlin JDSL + GraphQL-Kotlin(code first)을 사용하고 있습니다.) 두 번째는, 사실 저는 Kotlin Springboot 를 사용중인데, 코틀린 언어와 JPA 가 너무 안 어울린다는 생각을 종종 합니다. 예를 들면, DB table 에 정의된 column default 값을 쓰려면 JPA Entity 의 해당 필드에 null 을 넣어서 보내야하는데, 보통 테이블 컬럼에 default 를 쓰는 경우는 대부분 해당 컬럼이 not null 타입입니다. 그래서 당연히 JPA Entity 에도 필드 타입은 not null 로 하고 싶어집니다. 물론 @Column(insertable=false) 를 사용하긴 하지만, 결국 그럼 이 JPA Entity 객체를 생성할 때 해당 필드에 실제로 저장되지도 않을 값을 거짓으로 넣어야 하는 상황이 생깁니다. 그래서 조금 더 Kotlin 에 잘 맞는 Exposed 를 고려하자니, 도메인 모델 클래스와 JPA Entity 클래스 분리가 강제되는 느낌이고, 이게 과연 JPA 의 생산성을 따라올 수 있을까? 올바른 선택이 맞을까? 하는 의문이 듭니다. 그래서 궁금한 점은, 혹시 토비님이 추천하시는 좀 더 Kotlin 언어에 잘 맞고 Kotlin Springboot 를 생산적으로 사용할 수 있는 방법이 있을까요?

  • java
  • spring
  • spring-boot
  • jpa
  • 리팩터링
  • ddd
woonge 댓글 2 좋아요 10 조회수 958

user-loanHistory 폴더 구조 질문

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

안녕하세요! @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<UserLoanHistory> userLoanHistories = new ArrayList<>(); 이 코드를 봤을 때 User와 UserLoanHistory는 강한 연결관계를 가지고 있는 것 같습니다(이를 같은 aggregate라고 하는 것 맞나요?). 그래서 폴더 구조를 user 밑에 loanHistory를 넣으신 것 같은데, 일반적으로 이런식으로 폴더 구조를 잡나요? 아니면 domain 폴더 아래에 user와 같은 레벨로 loanHistory를 만들고, 대출 기능도 BookService에서 구현하는 게 아니라 UserLoanHistory용 컨트롤러/서비스/레포지토리를 따로 만들어 구현해도 되나요?

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
푸른하늘 댓글 2 좋아요 1 조회수 55

4. 단어뒤집기

미해결

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 명쾌한 강의 감사합니다. 이 영상의 solution 함수에서 파라미터로 n이 들어가지만 실제로 쓰이지 않는 것으로 이해하였습니다. 그러면 1. solution 함수 파라미터에 n을 굳이 넣어야 할 필요가 있나요? 2. 만약 n을 사용하고 answer를 int[n]로 지정하면 될 것 같은데 그렇게 해도 괜찮을까요? 3. ArrayList는 길이가 정해져있는 배열에 비해 성능에 있어 불리하지는 않을까요? 만약 불리하다면 2로 푸는 게 좋을까 생각이 들어서요.

  • java
  • 코딩-테스트
clzkwpaak2 댓글 1 좋아요 0 조회수 61

댓글 최대 2depth - CUD API 구현에서 질문 있습니다.

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

안녕하세요 선생님 좋은 강의 해주셔서 감사합니다. 댓글 create 구현에서 findParent() 함수를 구현할때, .filter(Comment::isRoot) 이런 코드가 있는데, 애초에 parentCommentId 에 root 댓글이 아닌 댓글의 ID가 존재하면 안되는 것 아닌가요 ? 존재하면 안되는 경우를 filter 로 걸러주는 것 같아서 필요한 코드인지 의문이 들어 질문 남깁니다.

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
댓글 2 좋아요 1 조회수 129

인기 태그

인프런 TOP Writers

주간 인기글