묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
DB 테이블간 연결에 대한 질문입니다.
안녕하세요 태현님. 두가지 질문이 있습니다.1. 지금까지(34강) 강의를 따라 하고 MySQL 워크벤치에서 ERD를 확인해 보면테이블 간에 PK - FK로 연결이 안 되어있는데요연결을 안 해주어도 괜찮은 이유가 뭔지 궁금합니다.제가 NestJS나 Express.js 로 백엔드를 만들었을 때는 TypeORM, Prisma, Sequelize 같은 ORM을 이용했었는데그때는 코드단에서 테이블 간에 연결 처리 (PK - FK로 연결)을 해주면데이터베이스에서 확인을 해봤을 때이런 식으로 연결이 된 것을 확인할 수 있었거든요..혹시 제가 뭔가 잘못 알고 있는 걸까요?굳이 DB에서 실제로 연결을 안 해주어도 괜찮은 건가요??아니면 스프링 + JPA 조합의 특성인가요??2. 그리고 MySQL 워크벤치에서create table user_loan_history ( id bigint auto_increment, user_id bigint, book_name varchar(255), is_return tinyint(1), primary key (id) );이렇게 DB create 문을 작성해서 실행 시키지 않아도 서버를 실행시킬 때 자동으로 로컬 DB에 테이블을 생성해 주도록 하는 설정이 있는지 궁금합니다.
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
yml파일에서 jpa설정을하고 에러가나요
Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [boolean] for value [ture]이런 오류가나는데 뭐가 문제일까요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
에러 발생 코드 관련 질문입니다.
//BookService @Service public class BookService { private final BookRepository bookRepository; private final UserLoanHistoryRepository userLoanHistoryRepository; private final UserRepository userRepository; public BookService( BookRepository bookRepository, UserLoanHistoryRepository userLoanHistoryRepository, UserRepository userRepository ) { this.bookRepository = bookRepository; this.userLoanHistoryRepository = userLoanHistoryRepository; this.userRepository = userRepository; } @Transactional public void saveBook(BookCreateRequest request) { bookRepository.save(new Book(request.getName())); } @Transactional public void loanBook(BookLoanRequest request) { // 1. 책 정보를 가져온다. Book book = bookRepository.findByName(request.getBookName()) .orElseThrow(IllegalArgumentException::new); // 2. 대출기록 정보를 확인해서 대출중인지 확인한다. // 3. 만약에 확인해는데 대출 중이라면 예외를 발생시킨다. if (userLoanHistoryRepository.existsByBookNameAndIsReturn(book.getName(), false)) { throw new IllegalArgumentException("이미 대출되어 있는 책입니다"); } // 4. 유저 정보를 가져온다. User user = userRepository.findByName(request.getUserName()) .orElseThrow(IllegalArgumentException::new); // 5. 유저 정보와 책 정보를 기반으로 UserLoanHistory를 저장 userLoanHistoryRepository.save(new UserLoanHistory(user.getId(), book.getName())); } } 북서비스 코드인데요// 1. 책 정보를 가져온다. Book book = bookRepository.findByName(request.getBookName()) .orElseThrow(IllegalArgumentException::new);이 부분에서 // 2. 대출기록 정보를 확인해서 대출중인지 확인한다. // 3. 만약에 확인해는데 대출 중이라면 예외를 발생시킨다. if (userLoanHistoryRepository.existsByBookNameAndIsReturn(book.getName(), false)) { throw new IllegalArgumentException("이미 대출되어 있는 책입니다"); } 이 부분 처럼 "존재하지 않는 책입니다" 라는 메세지를 터미널(콘솔인가요? 이거 찍히는 곳 명칭이 터미널인지 콘솔인지 모르겠네요) 에 찍어주려면 어떻게 해야하나요? 그리고 첫 번째 경우와 두 번째 경우에 에러를 발생시키는 방법이 다른 이유는 무엇인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Component를 InitDb에서 전역으로 해준 것 아닌가요?
@Component를 InitDb에서 전역으로 해준 것 아닌가요?다시 InitService에서 다시 @component를 해주는 이유가뭔지 궁금합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
글동록하는부분에서 등록을 하고나면 나이부분에 값이 00세라고들어가네요 이유가뭘까요??
객채셍성하고 등록화면부분올려드렷어요
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
로그인 적용확인 회차에대해서
위에 내용하고 겹치는듯한데 맞나요?... 로그인 적용확인 회차부터해서 뭔가 내용이 이어지질 않는듯한 느낌이듭니다....
-
미해결스프링 부트 - 핵심 원리와 활용
application.properties에서 spring.config.activate.on-profile에 빨간줄
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 이런 식으로 뜨는데 뭔가 설정이 잘못된 건가요?ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
V2에서 별도의 DTO를 사용하는 이유가 궁금합니다.
안녕하세요 강사님!Entity를 바로사용 하지 않는 이유는보안에 취약여러 곳에서 사용하기 때문에 entity가 바뀌면 곤란함이 두가지 때문이라고 이해했는데.V2의 경우에는 별도의 DTO를 구성해서 이를 해결한다고 말씀을 해주셨습니다. 하지만 사용 쓰임새가 다 다르면 별도의 DTO를 계속해서 고쳐줘야 하는건 V1과 마찬가지 아닌가요? 보안 문제만 해결할 수 있는 것처럼 보이는데 원리를 이해하지 못하겠습니다.
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
로드 밸런싱 관련 질문
안녕하세요! 강사님 로드 밸런싱 & 서버 관련 질문드립니다.Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)현재 저는 섹션 2 API Gateway Service 까지 강의를 진행한 상태입니다. 현업에서는 해당 강의에서 나와있는 것처럼 어플리케이션 단에서의 로드 밸런싱 구현을 많이 하나요?아니라면 현업에서는 어떠한 방법으로 자주 사용하여 구현을 하나요? 어떤 상황에서 어플리케이션 단에서의 로드 밸런싱 구현을 하나요?트래픽 분산을 목적으로 로드 밸런싱을 사용하기 위해 여러 개의 어플리케이션 인스턴스들을 서버에 올린다고 하였을 때 현업에서는 어떻게 관리하나요? AWS EC2 기준으로 설명해주시면 좋을 것 같습니다! 읽어주셔서 감사합니다(__)
-
미해결스프링 시큐리티
AjaxAuthenticationProvider에서 authenticate 함수 재정의 할 때 @Transactional 관련 질의입니다.
안녕하세요. 강의 잘 듣고 있습니다.제가 수강하는 시점엔 SpringBoot 3.x.x, security6를 써야 하지만, security5과 아키텍처는 대동소이할 거 같아 수업과 동일한 환경에서 강의 듣고 있습니다.강사님 영상에서 10:45 보시면 authenticate()에 @Transactional이 들어가있는데요. 제가 실습 환경에서는, 이 애노테이션 때문인 것 같은데, AjaxAuthenticationProvider 프록시 객체 생성에서 에러가 발생합니다.대체 @Transactional이랑 무슨 상관인지는 파악하지 못했지만 설마..하고 해당 애노테이션을 지우고 나니 AjaxAuthentication 프록시 객체가 잘 생성되고 정상 동작을 하더라고요.이유가 정말 궁금합니다.좋은 강의 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
docker network ip 대역 질문
docker network 지정 시 해당 network내에서 할당되는 ip 대역에 서비스 ip가 순차적으로 할당되는 것 같은데요, kafka같은 경우는 그 대역에서 직접 ip하나를 지정해서 사용하고 서비스에서도 그 kafka ip를 하드코딩으로 직접 지정해두는데, 환경에 따라 network ip 대역이 변경될 일은 없는건가요?docker container 네트워크 스펙인지 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka docker 사용 질문
질문이 있습니다. Local에 kafka를 직접 설치한 경우 kafka connect를 위해 jdbc connector 경로 지정 등 작업이 필요했던 것 같은데 docker compose로 구동시킬 때는 이러한 작업에 대한 지정이 필요 없는건가요??
-
해결됨코드로 배우는 React 19 with 스프링부트 API서버
강의 영상에 혹시 빠진게 있나요??
조금 전 있던 질문글 이랑 동일한 에러가 발생해서 코드 확인했더니 TodoController 클래스에서 put, delete를 구현하지 않았더라구요. 제가 뭔가 빼먹었나보다 하고 소스코드 찾아보니까 소스코드에는 있길래 소스코드 참고해서 해결했거든요. 그런데 그 다음에도 RootConfig 클래스를 만드는거나, CustomServletConfig 클래스에 addCorsMappings 메서드를 추가하는 과정을 소스코드 보면서 해결했었는데, 혹시 강의 영상에는 소스코드에 있는 내용 전부가 작성되는 과정이 나오는건 아닌걸까요? 제가 영상보다 코드치다 하면서 실수로 넘어간 부분이 있을수도 있는데, 강의 영상에는 빠져있고, 소스코드는 올라와 있는 부분들이 있는것 같아서요. 한번 확인 부탁드려도 될까요..? 제 착오였다면 죄송합니다 ㅠㅠ
-
미해결스프링 시큐리티 OAuth2
access_token 받은후 유저정보요청시 에러
안녕하세요 선생님 강의 진행중 오류가 해결되지 않아 이렇게 문의를 남깁니다. 다름이 아니라 제가 access_token을 받고 http://localhost:8081/user?accessToken=access_token이렇게 요청을 보내면OAuth2User oAuth2User = defaultOAuth2UserService.loadUser(oAuth2UserRequest);의 loadUser부분의 ResponseEntity<Map<String, Object>> response = getResponse(userRequest, request);에서 사진과 같이 RestClientException이 발생하고 그 이유는 body null 이기 때문이라는데 여기서 어떻게 손을 써야 오류가 고쳐질지 모르겠습니다. 혹시 해결방법을 아시는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
test중 NullPointerException에러발생
jpa와 db설정, 동작확인 강의를 듣고 클론코딩 중test중 NullPointerException에러발생mainjpabook.jpashop.Memberpackage jpabook.jpashop; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; private String username; }jpabook.jpashop.MemberRepositorypackage jpabook.jpashop; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Repository; @Repository public class MemberRepository { @PersistenceContext EntityManager em; public Long save(Member member) { em.persist(member); return member.getId(); } public Member find(Long id) { return em.find(Member.class, id); } } testjpabook.jpashop.MemberRepositoryTestpackage jpabook.jpashop; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) public void testMember() { Member member = new Member(); member.setUsername("memberA"); Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); assertThat(findMember.getId()).isEqualTo(member.getId()); assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } } application.ymlspring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug org.hibernate.type: trace build.gradleplugins { id 'java' id 'org.springframework.boot' version '3.2.1' id 'io.spring.dependency-management' version '1.1.4' } group = 'jpabook' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } 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 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }build, run 모두 intellj IDE로 하는중입니다.
-
미해결스프링 시큐리티 OAuth2
Resouce Server에서 JWT 토큰 검증 후 로직추가
Resource Server 에서 JWT 토큰 검증 후 access token 에서 claim 을 추출하여 인증된 사용자의 추가 정보를 DB에 조회 후 SecurityContextHolder 에 저장하는 로직을 추가 하려고 합니다. Resource Server 에서 커스터 마이징이 가능한게 AuthenticationManager와 JwtAuthenticationConverter 등등인데 JwtAuthenticationConverter 은 적합하지 않을거 같아 AuthenticationManager에 JwtAuthenticationProvider 커스터 구현체를 등록해서 진행해야 할거 같은데 더 좋은 방벙이 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
expected 옵션이 적용되지 않아 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. junit4 적용된걸 확인했는데도 test에서 적용이 안돼 질문드립니다 orderServiceTest 상품주문_재고수량초과 @TEST에서 expeced 오류로 뜹니다. @Test(expeced = NotEnoughStockException.class); public void 상품주문_재고수량초과() throws Exception{ //given Member member = createMember(); Item item = createBook("시골 JPA", 10000, 10); int orderCount =11; //when //Assertions.assertThatThrownBy(()->orderService.order(member.getId(), createBook().getId(). orderCount)) // .isInstanceOf(NotEnoughStockException.class); orderService.order(member.getId(), item.getId(), orderCount); //then fail("재고 수량 부족 예외가 발생해야한다"); build.gradledependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6") testImplementation 'junit:junit:4.13.1' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" } }
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
새로 만든 UserRepository 파일의 위치
UserJdbcRepository 는 repository 패키지 하위에 만들었었는데이 강의에서 새로 만든 UserRepository 는 왜 domain 패키지 하위에 만드는 이유가 궁금합니다.
-
미해결스프링 배치
flowJob 의 next() 에 대해서 궁금한 부분이 있습니다.
주황색 박스의 next() 부분을@Bean public Job batchJob() { return this.jobBuilderFactory.get("batchJob") .start(step1()) .on("COMPLETED") .to(step2()) .on("*") .stop() .from(step1()).on("*") .to(step3()) .on("COMPLETED") .to(step4()) .on("FAILED") .end() .end() .build(); }이렇게 on("COMPLETED").to(step4()) 로 변경해도 동일하게 동작하는게 맞을까요?next() 로 결국 이전 작업이 성공해야 실행되는것으로 알고있어서요
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Spring 3.xx버전 querydsl gradle 설정 관련 질문
QueryDSL 소개 강의 영상에서 gradle 설정하는 부분을 3이상버전 관련해서 올려주신 자료를 보면서 따라했는데 build-clean을 하고 해봐도 tasks-others밑에 compileQuerydsl파일이 생성되 지않아서 comlile.java 를 눌렀더니 generated에 파일들은 잘 생성됐습니다. plugins { id 'java' id 'org.springframework.boot' version '3.1.5' id 'io.spring.dependency-management' version '1.1.3' } group = 'jpabook' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } 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-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-devtools' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' //Hibernate5JakartaModule 등록 (하이버네이트 모듈) implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5-jakarta' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //QueryDsl 관련 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() } def querydslSrcDir = 'src/main/generated' clean { delete file(querydslSrcDir) } tasks.withType(JavaCompile) { options.generatedSourceOutputDirectory = file(querydslSrcDir) } 이렇게 작성했는데 혹시 틀린 부분이 있을까요?