묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
서비스 계층에서 삭제시 @Transactional 사용에 관해
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세요.- 검색해보았으나, 원하는 결과를 찾지 못했습니다. 검색어: 서비스 계층에서의 @Transactional 사용 기준문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요. ``` java@Transactionalpublic void write(Long postId, CommentCreate request) {Post post = postRepository.findById(postId).orElseThrow(PostNotFound::new);Comment comment = Comment.builder().post(post).author(request.getAuthor()).password(request.getPassword()).content(request.getContent()).build();post.addComment(comment);}public void delete(Long commentId, CommentDelete request) {Comment comment = commentRepository.findById(commentId).orElseThrow(CommentNotFound::new);commentRepository.delete(comment);}```서비스 계층에서 댓글 작성의 경우 @Transational 적용했지만, 삭제의 경우 적용하지 않았는데 강의에서 이 두 경우의 차이에 대해 이해해야 하고, 찾아보라고 이야기해주셨습니다. 지금까지 제가 공부한 내용에 비추어보면 서비스 게층의 생성 및 삭제의 경우모두 @Transcational 어노테이션을 항상 사용해 왔습니다. 왜냐하면, 수정 삭제의 경우 하나의 트랜잭션에서 시작 및 종료되어야 하기 때문이라고 생각했습니다.구글링도 해보았는데, 납득할만한 이유를 찾지 못하여 호돌맨님 및 수강생분들에게 질문드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 db 파일 생성 안됨
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의와 강의 자료를 바탕으로 해도 계속 이런 에러가 발생합니다.db 파일이 제대로 생성되지 않아서 생긴 오류일까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의 소제목에는 비대칭키를 활용한 암호화라고 되어있는데
apiEncryptionKey.jks (개인키)와 이에 파생된 public.key (공개키)를 생성한 것 까지는 이해가 되었습니다.강의중 encrypt/decrypt 를 하는 과정에서 모두 apiEncryptionKey.jks (개인키)를 사용한 대칭키 방식을 사용한 것 같은데 비대칭키 전략을 사용하는 부분이 있나요? 아니면 비대칭키를 추후에 활용할 수 있도록 파생키를 생성하는 방법을 알려주신건가요?java key store를 통해 구성정보의 암/복호화에 대칭키 방식을 사용한건지 비대칭키 방식을 사용한건지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
현업에서 제네릭 쓰나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]가끔 오류날 때 recompile 해보곤 하는데..G:\spring\spring-data-project\jpashop\src\main\java\jpabook\jpashop\api\MemberApiController.java:uses unchecked or unsafe operations.Recompile with -Xlint:unchecked for details. 이게 뭔가하고 찾아보니, @Data @AllArgsConstructor static class Result<T>{ private int count; private T data; }여기 이 부분이..물론 파란색이라 에러같은 느낌은 아니고, 그냥 안내 정도로 보이긴 하는데,https://bgpark.tistory.com/33 근데 제가 언뜻 왠만하면 제네릭 쓰지 말라고 들었던거 같긴 한데 기억이.. 잘못들었는지 왜곡되었는지..옛날 라이브러리들은 제네릭으로 구현된게 많아서 그냥 그거 쓰고 제네릭으로 따로 구현하지 말랬던거 같은데.. 제가 잘못 기억하고 있는 거겠죠?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의에 사용된 코드는 제공되지 않나요
보통 강의는 github 주소가 제공되는데강의에 사용된 코드는 제공되지 않나요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
카테고리 관련 질문드립니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예 )2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예 )[질문 내용]그러면 ManyToMany는 안쓴다고 하셨는데 .보통 카테고리는 실무에서 다는 알수 없겠지만 대략적으로 이해될수 있게 어떤 형식으로 entity를 구성하는지 알수있을까요보통 3뎁스 정도로 잡는다고 한다면요 ..실무에 이번에 jpa도입 할려고 하는데 카테고리는 어떤식으로 하는지 궁금합니다 .Mybatis를 주로 쓰고 관계형 테이블에서는 대충 감이 오는데 엔티티로 할려니 어떤식일까 강의 듣는 내내 .. 궁금해서요 ...id , parentid, level, name 등이 있다고 가정한다면요 ..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2에 Member 테이블이 생성되지 않아요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이렇게 컴파일 할 때 테이블이 실행되는 줄이 강의처럼 출력되지 않고 h2 에도 실제로 만들어지지 않아요.
-
미해결스프링 시큐리티 OAuth2
Consent Page에서 기존 다른 OAuth처럼 필수 동의와 선택 동의를 구분해서 받을 수 있는지 궁금합니다.
기존 Default Consent Page는 선택적 동의만 받을 수 있도록 되어 있는 것 같습니다.Custom Consent Page 예시를 보더라도 Consent Page를 만드는 예시일 뿐 필수동의와 선택동의를 구분하는 방법은 찾을 수 없었습니다.결론적으로, Consent Page에서 선택 동의와 필수동의를 구분해서 받을 수 있는지와, 만약 가능하다면 어떻게 구성해야하는 지 궁금합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Execution failed for task ':compileJava'. 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 강의수강 잘 하고 있는 한 수강생입니다 자바 버전11버전으로 설치하고 셋팅도 맞춰서 했는데 왜 계속 오류가 나는지 모르겠습니다..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
궁금한게 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.여기 강의에 보면 검은색 화면에 노트같은거 있는데 그건 혹시 제공이 되지 않나요 ??? erd라던가 설명 보니깐 그거 보면서 보면 괜찮을꺼 같아서요
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
git add . 에서 오류가 발생하는데 어떤 문제인가요??
그리고 파일들을 보니까 다 빨간색으로 변해있더라고요 언제부터 변했는지는 모르겠어요. 우선 git 명령어 치기 전까지는 괜찮았어요 오류를 찾아보니까 해당 파일에 .git 파일을 지우고 다시 하라고 했던 것 같은데그런 파일은 없더라고요오류에 대해 잘못 찾았나 봐요 ㅎㅎ; -------------------.git 폴더는 다시 보니까 숨긴 항목으로 숨겨져 있었네요...git 폴더 지우고 다시 처음부터 했더니 이상 없습니다!
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
2.5강에서 포스트맨 오류와 전에 실습한 내용에 대해 질문 드립니다
강의 내용을 최대한 놓치지 않고 다 작성한 것 같은데 포스트맨에 나오는 내용이 다릅니다..[22:12:33.504][WARN ][org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.logException:line207] - Resolved [jakarta.validation.ConstraintDefinitionException: HV000243: Constraint ConSilkTea.SmallRecordServer.common.annotation.ValidEnum references constraint validator type ConSilkTea.SmallRecordServer.core.annotation.ValidEnumValidator, but this validator is defined for constraint type ConSilkTea.SmallRecordServer.core.annotation.ValidEnum.]이건 로그에 나온겁니다..전에 했던 블로그 api랑 충돌이 일어나는 것 같은데서버 하나당 api는 1개 밖에 사용을 못할까요?다중으로 사용하고 싶다면 어떻게 변경을 하면 좋을지 몰라 질문 남깁니다
-
미해결[초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기
TokenProvider의 Key 관련하여 질문이 있습니다.
안녕하세요, 강의 너무 잘 보고있습니다.`JwtTokenProvider.kt` 생성 중, 궁금한 것이 있어 질문 남깁니다. createToken에서 signWith에 사용하는 key를 private val key by lazy { Keys.hmacShaKeyFor(Decoders.BASE64.decode(secret)) }yml파일에 쓴 key 그대로 사용하는 것이 아닌, 아래와 같이 한번 더 decode를 거치는 것으로 보여지는데요. signwith를 통해 또 다시 HS256으로 인코딩 하는데, 그 전에 한번 더 디코딩한 키를 넣는 이유가 궁금합니다!
-
미해결스프링 시큐리티
remember-me 쿠키와 토큰 기반 인증 방식
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.remember-me 인증이 토큰 기반 인증을 사용해 유효성을 검사한다고 하셨는데, 토큰 기반 인증은 statelesss한 방식 알고있습니다. remember-me 인증은 세션을 이용한 서버 기반 인증 방식으로 사용자 상태를 저장하고, 토큰 기반 인증 방식은 그 반대라고 생각되는데, 강사님은 토큰 기반 인증 방식을 좀 더 넓은 범위로 보신건지 궁금합니다!
-
해결됨토비의 스프링 부트 - 이해와 원리
DataSourceConfig에서 @EnableTransactionManagement를 사용하면 DataSourceTest가 안 되는것에 대한 질문이 있습니다.
안녕하세요 토비님. 강의 정말 잘 듣고있습니다! JdbcTemplate과 트랜잭션 매니저 구성 강의를 듣다가 @EnableTransactionManagement으로 트랜잭션(tx) 관리 기능을 열어주고 기존 DataSourceTest.java 예제를 실행하니 java.lang.IllegalStateException: Failed to unwrap proxied object 에러가 계속 발생합니다.DataSourceConfig.java에서 @EnableTransactionManagement 애노테이션을 제외를 하면 DataSourceTest.java 테스트가 정상적으로 잘 돌아가더라고요...음 java와 spring 버전, 라이브러리는 모두 동일하게 설정을 했습니다. 제 소스 코드는 하단에 있습니다! 버전 문제로 해당 예제가 안 돌아가는 것인지? 왜 안 되는지 궁금합니다.. 바쁘실텐데 이유나 원인을 아시면 알려주시면 감사하겠습니다. 에러코드java.lang.IllegalStateException: Failed to unwrap proxied object at org.springframework.test.util.AopTestUtils.getUltimateTargetObject(AopTestUtils.java:105) at org.springframework.boot.test.mock.mockito.SpringBootMockResolver.resolve(SpringBootMockResolver.java:35) at org.mockito.internal.util.MockUtil.resolve(MockUtil.java:118) at org.mockito.internal.util.MockUtil.isMock(MockUtil.java:108) at org.mockito.internal.util.DefaultMockingDetails.isMock(DefaultMockingDetails.java:32) at org.springframework.boot.test.mock.mockito.MockReset.get(MockReset.java:106) at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.resetMocks(ResetMocksTestExecutionListener.java:82) at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.resetMocks(ResetMocksTestExecutionListener.java:70) at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.beforeTestMethod(ResetMocksTestExecutionListener.java:57) at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:293) build.gradleplugins { id 'java' id 'org.springframework.boot' version '2.7.6' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'tobyspring' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } repositories { mavenCentral() maven { url 'https://repo.clojars.org' name 'Clojars' } } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework:spring-jdbc' implementation 'hikari-cp:hikari-cp:3.0.1' runtimeOnly('com.h2database:h2:2.1.214') // spring-boot-starter-undertow // implementation 'org.springframework.boot:spring-boot-starter-jetty' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } DataSourceTest package tobyspring.helloboot; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; @HellobootTest public class DataSourceTest { @Autowired DataSource dataSource; @Test public void connect() throws SQLException { Connection connection = dataSource.getConnection(); connection.close(); } } HelloBootTestpackage tobyspring.helloboot; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = HellobootApplication.class) @TestPropertySource("classpath:/application.properties") @Transactional public @interface HellobootTest { } DataSourceConfig.javapackage tobyspring.config.autoconfig.datasource; import com.zaxxer.hikari.HikariDataSource; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import org.springframework.jdbc.support.JdbcTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import tobyspring.config.ConditionalMyOnClass; import tobyspring.config.MyAutoConfiguration; import tobyspring.config.autoconfig.EnableMyConfigurationProperties; import javax.sql.DataSource; import java.sql.Driver; @MyAutoConfiguration @ConditionalMyOnClass("org.springframework.jdbc.core.JdbcOperations") @EnableMyConfigurationProperties(MyDataSourceProperties.class) @EnableTransactionManagement public class DataSourceConfig { @Bean @ConditionalMyOnClass("com.zaxxer.hikari.HikariDataSource") @ConditionalOnMissingBean DataSource hikariDataSource(MyDataSourceProperties properties) { HikariDataSource dataSource = new HikariDataSource(); dataSource.setDriverClassName(properties.getDriverClassName()); dataSource.setJdbcUrl(properties.getUrl()); dataSource.setUsername(properties.getUsername()); dataSource.setPassword(properties.getPassword()); return dataSource; } @Bean @ConditionalOnMissingBean DataSource dataSource(MyDataSourceProperties properties) throws ClassNotFoundException { SimpleDriverDataSource dataSource = new SimpleDriverDataSource(); dataSource.setDriverClass((Class<? extends Driver>) Class.forName(properties.getDriverClassName())); dataSource.setUrl(properties.getUrl()); dataSource.setUsername(properties.getUsername()); dataSource.setPassword(properties.getPassword()); return dataSource; } @Bean @ConditionalOnSingleCandidate(DataSource.class) @ConditionalOnMissingBean JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean @ConditionalOnSingleCandidate(DataSource.class) @ConditionalOnMissingBean JdbcTransactionManager jdbcTransactionManager(DataSource dataSource) { return new JdbcTransactionManager(dataSource); } }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
setter 을 사용하지 않는다면 어떻게 해야 할까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예강의에서는 setter를 사용하지 않고 하는게 바람직하다고 언급하신적이 있습니다. public static OrderItem createOrderItem(Item item,int orderPrice,int count){ OrderItem orderItem=new OrderItem(); orderItem.setItem(item); orderItem.setOrderPrice(orderPrice); orderItem.setCount(count); item.removeStock(count); return orderItem; }이것은 영한님 강의의 OrderItem이라는 중간테이블을 생성해주는 것이였습니다. 위에서 set,set,set 이 많이 나오는데 이게 아마 builer패턴? 으로 위 코드에서 setter를 지워주는것 맞져?? 그러면 Order의 연관관계 편의 메서드인 아래 코드는 또 어떻게 바꿔야 할까 public void addOrderItem(OrderItem orderItem){ orderItem.setOrder(this); this.orderItems.add(orderItem); }이거는 또 어떻게 바꿔야 할까요?? 실무에서는 이런 것까지도 set을 안쓰나요? 아니면 뭐set 대신 이름만 inItOrder로 바꿔야 하는 것인가요? 질문 2) 솔직히 set을 왜 안써야 하는지 감이 안옵니다. 다른 개발자가 무작정 set을 호출할수 있다는게 단점이라고 하신 것 같은데 그러면 뭐 cancelOrder 이런 메서드로 바꾸면 다른 개발자가 이걸 호출할수도 있지 않나요?? 질문 3) 가끔 보면 이런 코드가 있습니다. public void initPost(Post post) { if(this.post == null) this.post = post; }이것은 init 이기때문에 단순히 null 인지 체크해주는 것인가요??가끔 이렇게 매개변수들어온게 null 인지 체크하는 로직이 들어있는게 있더라고요!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
영한님 죄송합니다. 답변을 제대로 이해하지 못했습니다 ㅠ
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (페치 조인 질문있습니다! - 인프런 | 질문 & 답변 (inflearn.com) 이것을 작성했었던 글쓴이인데 아직 이해가 덜되어서 질문합니다! 제 질문과 영한님의 답변을 요약하면제 질문은 1대 다 에서는 fetch join을 고려하고 다대1에서 batch size를 이용해서 최적화하는게 좋았는데 다대1에서 그러면 역으로 1대다기준으로 fetch join 쓰면 안되냐는게 질문이였고 그에 대한 영한님의 답변은 다쪽(위에 질문에서는 중간테이블) 을 기준으로 조회하기 어려운 경우가 있는데 그 경우는 1쪽기준으로 페이징을 한다면 다쪽에서 페이징이 모호하다. 라는 것이였습니다.(제가 제대로 이해한 것 맞겠죠?)@Query("select pc from Person_Club pc join fetch pc.club where pc.person.id=:personId ORDER BY pc.club.name DESC") List<Person_Club> findTop5ByPersonIdOrderByClubName(@Param("personId") Long personId,Pageable pageable);위 코드는 정확히 기억이 안나는데 Person_Club은 person과 Club의 다대다 중간테이블로 만들었고 where 절 로 persinID를 받아서 범위를 제한하고 페이징을 했던걸로 기억하는데 이런 경우는 1쪽기준으로 페이징을 한다면(where 절로 범위 제한) 다쪽에서 페이징이 모호해지지 않지 않나요?? 부족한 설명죄송합니다
-
미해결실전! 스프링 데이터 JPA
h2 데이터베이스 연결 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 비슷하지만 없는 것 같습니다.3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]강의 극 초반인데 h2 데이터베이스 문제로 시작도 못 하구 있습니다. ㅠㅜ영한쌤과 같은 버전으로 하려고 했는데 start.spring.io에서는 2.2.1이 안되더라구요ㅠㅜ 그래서 3.xx 버전을 사용하고 있습니다. 따라서 h2데이터베이스도 2.1xx 버전을 깔았습니다.근데 자꾸 h2연결이 안되어서 run도 안되고 데이터베이스 연결도 안 되더라구요ㅠㅜdb이름도 datajpa, data-jpa 등등 바꿔서도 해보고 이름도 바꿔서도 해보고 해도 안되네요.그리고 db파일은 생성이 원래 되었었는데, 지금 현재 안되서 프로젝트와 db파일을 지우고 첨부터 다시 해보고를 반복하면서 지웠었는데, 이제는 아예 생성이 안되더라구요...ㅎㅎ어떻게 해야할까요>?ㅠㅜ h2연결이 안되서 강의 진도를 못 나가고 있습니다.h2데이터베이스는 어떻게 생성을 하는건가요? 그냥 yml설정해주고 빌드를 하고 h2 console에 연결 하면 생기는 건가요? 아니면 생긴걸 확인하고 console로 들어가는건가요?감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
jpql 엔티티 인지 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]일단은 해결 했습니다.findAllString 이용하는데 Order를 얘가 모르는 거 같아서..String jpql = "select o From jpabook.jpashop.domain.Order o join o.member m";이렇게 패키지경로까지 다 명시해줬더니 인지를 하더라구요..안 그러면 org.hibernate.query.sqm.UnknownEntityException: Could not resolve root entity 'Order' at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitRootEntity(SemanticQueryBuilder.java:1960) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitRootEntity(SemanticQueryBuilder.java:253) ~[hibernate-core-6.2.13.Final.jar:6.2.13.Final] ...............얘가 이렇게 Order 인지 못한다고 오류가 뜹니다..원래 엔티티는 그냥 @Entity 등록 하면 알아서 인지 되는걸로 알고 있었는데..왜 이런 걸까요?package jpabook.jpashop.domain; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity(name = "orders") @Getter @NoArgsConstructor(access = AccessLevel.PUBLIC) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; public void changeMember(Member member){ this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem){ orderItems.add(orderItem); orderItem.setOrder(this); } private void setOrderDate(LocalDateTime orderDate) { this.orderDate = orderDate; } public void changeDelivery(Delivery delivery){ this.delivery = delivery; delivery.setOrder(this); } private void setStatus(OrderStatus status) { this.status = status; } public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){ Order order = new Order(); order.changeMember(member); order.changeDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; } public void cancel(){ if(delivery.getStatus() == DeliveryStatus.COMP){ throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다."); } this.setStatus(OrderStatus.CANCEL); for (OrderItem orderItem : orderItems) { // orderItem.getItem().removeStock(orderItem.getCount()); orderItem.cancel(); } } public int getTotalPrice(){ int totalPrice = 0; for( OrderItem orderItem : orderItems){ totalPrice += orderItem.getTotalPrice(); } return totalPrice; } }
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
준영속 상태란 것은 추상적인 개념인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]영속상태라는 것은 영속성 컨텍스트에 들어가는 것으로 명확한데, 준영속 상태는 뭐 그런 꼬리표 같은게 붙는 건가요?아니면 엔티티긴 한데 생성되고 영속성 컨텍스트에 없는 상태를 그냥 추상적으로 준영속상태라고 부르는 건가요?