묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨토비의 스프링 6 - 이해와 원리
IntelliJ 에서 Ultimate 에디션 인데 Spring Initializr 가 없습니다.
안녕하세요 토비님, IntelliJ 에서 Ultimate 에디션 인데 Spring Initializr 가 없습니다.대신 Spring Boot 가 있습니다.IntelliJ 버전은 2024.1.6 입니다. IntelliJ 버전이 올라가면서 변경된 것이 맞는지요.구글링을 해봐도 다들 커뮤너티 버전 이야기 밖에 없네요.재미 있는건 플러그인을 확인해 보면 분명히 installed 에 설치 되어 있다고 나옵니다.제 맥에 설치된 IntelliJ 의 문제 라고 생각 했지만 다른 맥에 역시 동일한 최신 버전의 IntelliJ 를 설치 후 확인해 보니 동일 합니다. 변경된 것이 맞을까요?
-
미해결스프링 핵심 원리 - 기본편
테스트 코드 실행 시 로그 출력
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이번편 뿐만 아니고 강의를 보다보면 테스트 코드를 똑같이 작성을 해도 영상에서는 로깅 내용이 출력이 되는데 제가 똑같은 환경에서, 똑같은 코드로 테스트를 진행하면 로그가 보이지를 않는데 혹시 로그를 출력하는 방법이 따로 있을까요?
-
미해결Java 마이크로서비스(MSA) 프로젝트 실습
config파일이 생성이 되면.. item-service 프로젝트에서..
config파일이 생성이 되면.. item-service 프로젝트에서..만드는 과정중에 에러가 발생하였습니다.아래와 같은 이슈가 발생되는데..해결 방법이 있을까요?2024-08-13T23:22:04.431+09:00 DEBUG 50092 --- [mstudy] [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : Application failed to start due to an exceptionorg.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:186) ~[spring-boot-autoconfigure-3.3.2.jar:3.3.2] at org.springframework.boot.autoconfigure.jdbc.PropertiesJdbcConnectionDetails.getDriverClassName(PropertiesJdbcConnectionDetails.java:49) ~[spring-boot-autoconfigure-3.3.2.jar:3.3.2] at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:55) ~[spring-boot-autoconfigure-3.3.2.jar:3.3.2] at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:117) ~[spring-boot-autoconfigure-3.3.2.jar:3.3.2] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:146) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:644) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1355) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1185) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1443) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:904) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:542) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1355) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1185) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:313) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.1.11.jar:6.1.11] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:954) ~[spring-context-6.1.11.jar:6.1.11] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.11.jar:6.1.11] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.2.jar:3.3.2] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.2.jar:3.3.2] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.2.jar:3.3.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.2.jar:3.3.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.2.jar:3.3.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.2.jar:3.3.2] at com.study.mstudy.MstudyApplication.main(MstudyApplication.java:10) ~[classes/:na] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) ~[spring-boot-devtools-3.3.2.jar:3.3.2]2024-08-13T23:22:04.437+09:00 ERROR 50092 --- [mstudy] [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : ***************************APPLICATION FAILED TO START***************************Description:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver classAction:Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may need to activate it (the profiles local are currently active).Process finished with exit code 0
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 객체 트랜잭션 내부 호출
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Transactional이 작성되지 않은 메서드에서 @Transactional이 작성된 자신의 메서드를 호출하면 트랜잭션이 실행되지 않는다는 것은 이해하였습니다. 그러면 @Transactional이 작성된 메서드에서 @Transactional이 작성된 자신의 메서드를 호출하면 현재 자신이 프록시 객체이므로 트랜잭션이 실행되는걸까요? 아니면 현재 프록시 객체가 아니라 타겟 객체이므로 똑같이 트랜잭션이 실행되지않는걸까요?
-
미해결토비의 스프링 부트 - 이해와 원리
강의자료
안녕하세요 토비님 혹시 강의자료로 사용했던 notion 은 공유 안되나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
main 함수 실행 에러
첫번째 스크린샷 build ~ using을 인텔리제이로 썼을 땐 에러가 안 나는데 이번 강의에서 gradle(default)로 설정한 후 main함수 실행 시 에러가 뜨며 실행이 되지 않습니다. 다른 질문들 참고해봤는데 다른 건 없고 계속 똑같은 오류가 뜨더라구요.. 해결 방법이 있을까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
"정상 이체" 정상 실행인데 "이체중 예외 발생"은 실패하는 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 스프링 AOP는 스프링 컨테이너에서 등록된 빈들을 통해 DI가 되고 트랜잭션 프록시 객체를 생성하는 것은 완벽히 이해 했습니다. 근데 MemberServiceV3_3는 스프링 AOP를 쓰는데 강의처럼 Bean을 등록하기 전에 "정상 이체" 메소드는 정상 실행되고 "이체중 예외 발생"은 롤백이 일어나지 않아 실패하는건가요 ?빈들을 등록하지 않았기 때문에 "정상 이체" 메소드도 커밋이 되지 않아야 된다고 생각하는데 이유가 궁금합니다 !!
-
미해결Java 마이크로서비스(MSA) 프로젝트 실습
제목을 입력하지않았는데 포스트맨에서 제목이 나오지 않습니다.
package com.study.mstudy.item.controller;import com.study.mstudy.item.dto.ItemDTO;import com.study.mstudy.item.dto.ResponseDTO;import com.study.mstudy.item.service.ItemService;import jakarta.validation.Valid;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*;@RestController@RequestMapping(value="v1/item")@Slf4j@RequiredArgsConstructorpublic class ItemController {private final ItemService itemService; @RequestMapping(value="/add",method= RequestMethod.POST)public ResponseEntity<ResponseDTO> add(@Valid @RequestBody ItemDTO itemDTO){ResponseDTO.ResponseDTOBuilder responseDTOBuilder = ResponseDTO.builder(); itemService.insertItem(itemDTO); log.debug("request add item id= {}",itemDTO.getId()); responseDTOBuilder.code("200").message("success"); return ResponseEntity.ok(responseDTOBuilder.build()); }}package com.study.mstudy.item.dto;import jakarta.validation.constraints.NotBlank;import jakarta.validation.constraints.Positive;import jakarta.validation.constraints.Size;import lombok.Data;@Datapublic class ItemDTO {@NotBlank(message = "ID는 필수 입력 값입니다.")@Size(max=10, message = "ID는 크기 10이하까지 작성가능합니다.")private String id; @Size(max=20, message = "이름은 20자까지 작성가능합니다.")private String name; @Size(max=200, message = "설명은 최대 200자까지 작성가능합니다.")private String description; @Positive private long count; private String regDts; private String updDts;}예제 보고 따라했으나..결과는 이미지 처럼 나오는데 저도 포스트맨으로설정하면 선생님처럼 나오게하고 싶은데 방법이 있을까요?
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
섹션1. 빌드에러가 발생합니다.
. ..java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 예외가 발생하여 빌드가 되지 않습니다.자주 묻는 질문에도 해당 내용이 없는 것 같습니다.
-
해결됨토비의 스프링 6 - 이해와 원리
도메인 오브젝트 테스트 강의 개선 과제
안녕하세요.섹션3 마지막 도메인 오브젝트 테스트에서 한 줄로 줄이기 해보라고 하셨는데, 제 생각이 맞는건지 코멘트 부탁드리겠습니다.@Component public class PaymentService { private final ExRateProvider provider; //private final Clock clock; public PaymentService(ExRateProvider provider/*, Clock clock*/) { this.provider = provider; //this.clock = clock; } public Payment prepare(Long orderId, String currency , BigDecimal foreignCurrencyAmount) throws IOException { return Payment.createPrepared(orderId, currency, foreignCurrencyAmount, this.provider); } }static Payment createPrepared(Long orderId, String currency, BigDecimal foreignCurrencyAmount, ExRateProvider exRateProvider) throws IOException { BigDecimal exchangeRate = exRateProvider.getExRate(currency); BigDecimal convertedAmount = foreignCurrencyAmount.multiply(exchangeRate); LocalDateTime validUntil = LocalDateTime.now(Clock.fixed(Instant.now(), ZoneId.systemDefault())).plusMinutes(30); return new Payment(orderId, currency, foreignCurrencyAmount, exchangeRate, convertedAmount, validUntil); }웹환경 기준으로는 사용자 각각의 요청마다 payment가 달라야하고 따라서 유효시간도 다를것이기 때문에, Payment 자체나 Clock.systemDefaltZone()을 바로 싱글톤한 Bean으로 등록하면 안될 것 같더라고요. (테스트돌려보니 다른 객체라도 무조건 시간 같게 나오는 것 확인) 이렇게 작성해도 또 다른 문제는 없는지 확인부탁드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@NotEmpty 어노테이션
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@NotEmpty어노테이션이 임포트가 안됩니다 혹시 버전차이때문에 그런건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
slf4j 보안에 대해 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]혹시 slf4j가 보안에 취약하다고 Logback를 사용하라는 블로그글을 본 적이 있는데 혹시 사실인가요??보안이 뚫렸다고 표현을 해서 궁금합니다
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
25강 findAll듣던중에
다음 첨부파일처럼 공유자께(첨부1)서는 public UserResponse(long id, User user) { }가 있습니다.그런데 저는 지금까지 쓴 코드에서 첨부파일(첨부2)처럼 저 코드부분이 없습니다.몇강에서 놓친건가요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
순수 jdbc 질문 있어요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]순수 jdbc 강의 9분 2초에 string sql을 상수로 빼는 것이 더 나은 이유가 무엇인지 궁금합니다
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
25강 질문있습니다.
저장기능 변경에서 save를 하게 되면 저장된 User객체가 반환되는데 이때 id를 사용할 수도 있다.라고 했는데반환되는것이 User객체의 ID인건가요?그리고 꼭 반환 안하고 처음에 작성했던 public void saveUser(UserCreateRequest request) { userRepository.save(new User(request.getName(), request.getAge())); }이렇게 써도 되는건가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
25강 질문있습니다
JpaRepository를 UserRepository가 상속받게 해줄때, 만든 테이블의 매핑 객체인 User 와 유저 테이블의 id인 Long 타입을 각각 적어주어야 한다고 하셨는데 user객체는 이해가 가는데 갑자기 id인 Long타입은 왜 적나요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
OncePerRequestFilter 질문
OncePerRequestFilter는 요청당 한 번만 필터가 동작하도록 보장된? 필터라고 말씀해주셨는게 하나의 요청에 하나의 필터가 여러 번 동작하는 경우도 있나요..?
-
미해결토비의 스프링 부트 - 이해와 원리
Hikari 라이브러리가 없으면 오류가 나는거 아닌가요
제가 이번 강의까지 보다가 한달만에 다시봐서 헷갈리는걸수도 있는데 갑자기 궁금하여 질문드립니다..Hikari 라이브러리를 gradle에서 가져오지 못하는 이슈 때문에 이번 강의의 커뮤니티 게시판에 다른 분이 작성한 글을 참고하여 토비님과 다르게 gradle에 implementation('com.zaxxer:HikariCP:4.0.3')를 추가해줘서 강의를 보고 있는데요.강의에서 DataSourceConfig 클래스 안에서 Hikari 관련된 빈을 등록하여 사용하려고 하는데, 이게 어떻게보면 Hikari 관련된 라이브러리가 있으면 사용하고, 아니면 기본 DataSource를 사용하게끔 하는 의도가 있는 자동구성등록하는 방법 이잖아요.. 근데 Hikari 라이브러리를 gradle에 추가 후, 토비님 처럼 테스트를 하면 Hikari가 DataSource로 사용되어 정상 동작하는데, 만약에 반대로 Hikari를 gradle에서 빼면 기본적인 SimpleDriverDataSource 객체가 사용되는게 예상을 하였는데, 당연하게도? gradle에서 Hikari 관련된 implement를 제거해버리면, SimpleDriverDataSource 객체를 사용하기 전에 DataSourceConfig 클래스 안에서 Hikari 관련된 로직들이, Hikari 라이브러리가 없기 떄문에 오류가 나지 않나요?즉, Hikari라는 라이브러리가 없도록, gradle에서 Hikari와 관련된 implements를 빼버리면 SimpleDriverDataSource 가 사용되는게 아니라, 애초에 소스에서 오류가 나는게 맞는건데.. 제가 어디부터 혼란이 온지 모르겠네요.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
open-in-view값 true/false
@Controller @RequiredArgsConstructor @RequestMapping("/board") public class BoardController { @PostMapping("/update") public String update(@ModelAttribute BoardDTO boardDTO, Model model) { BoardDTO board = boardService.update(boardDTO); model.addAttribute("board", board); return "detail"; } } @Service @RequiredArgsConstructor public class BoardService { private final BoardRepository boardRepository; public BoardDTO findById(Long id) { System.out.println("findById : "+ em.getDelegate()); // 이 아래 코드에서 질문 있습니다. Optional<BoardEntity> optionalBoardEntity = boardRepository.findById(id); if (optionalBoardEntity.isPresent()) { BoardEntity boardEntity = optionalBoardEntity.get(); return BoardDTO.toBoardDTO(boardEntity); } else { return null; } } public BoardDTO update(BoardDTO boardDTO) { System.out.println("update : "+ em.getDelegate()); BoardEntity boardEntity = BoardEntity.toUpdateEntity(boardDTO); boardRepository.save(boardEntity); return findById(boardDTO.getId()); } } @MappedSuperclass @EntityListeners(AuditingEntityListener.class) @Getter public class BaseEntity { @CreationTimestamp @Column(updatable = false) private LocalDateTime createdTime; @UpdateTimestamp @Column(insertable = false) private LocalDateTime updatedTime; } @Entity @Getter @Setter @Table(name = "board_table") public class BoardEntity extends BaseEntity { @Id GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String boardWriter; private String boardPass; private String boardTitle; private String boardContents; private int boardHits; public static BoardEntity toUpdateEntity(BoardDTO boardDTO) { BoardEntity boardEntity = new BoardEntity(); boardEntity.setId(boardDTO.getId()); boardEntity.setBoardWriter(boardDTO.getBoardWriter()); boardEntity.setBoardPass(boardDTO.getBoardPass()); boardEntity.setBoardTitle(boardDTO.getBoardTitle()); boardEntity.setBoardContents(boardDTO.getBoardContents()); boardEntity.setBoardHits(boardDTO.getBoardHits()); return boardEntity; } } 위에 코드 상황에서 open-in-view를 true로 하면 optionalBoardEntity에 createdTime 값이 null입니다. 제 생각으로는 open-in-view가 true 이므로 update()에서 (createdTime 값이 없는) boardEntity가 영속성 컨텍스트 1차 캐시에 존재하고, findById()에서 boardRepository.findById(id) 값을 호출하지만 1차캐시에 있는 값을 줘서 최종적으로 boardEntity값에는 createdTime값이 없는 것으로 이해했습니다. 그런데 왜 open-in-view값을 false로 하면 boardEntity에 createdTime 값이 있는지 모르겠습니다. open-in-view가 true 이건 false 이건 영속성 컨텍스트 생존 범위에 Service는 포함되니 createdTime 값이 둘 다 없어야 되는것이 아닌지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 JdbcTemplate강의를 듣고 궁금한 점이 생겨 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]다른 강의의 내용에서 스프링 빈에 dataSource와 JdbcTemplate이 등록이 되어 있는 내용을 보았습니다.그래서 dataSource를 통해 DB와 커넥션을 만드는 부분에서는 새로운 객체를 생성하지 않고 dataSource를 받아와 의존성 주입을 받았는데 여기에서는 JdbcTemplate의 새로운 객체를 생성하여 의존성 주입을 받는데 그러면 싱글톤에서 위배가 되는것 아닌가요?다른 강의에서는 SQL을 DB로 사용하였습니다. 혹시 DB의 차이에 따라 위와 같이 새로운 JdbcTemplate의 객체를 생성할 수 있는 걸까요?