묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결코드로 배우는 React with 스프링부트 API서버
cors 설정에도 불구하고 405 에러 스프링부트 3.16
안녕하세요 영상강의를 보며 클론 코딩하면서 하나씩 배우고 있는데백단에서 Cors 설정을 해주었음에도 불구하고 (강의 섹션 3 수정/삭제 처리 진행 중 )@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("HEAD", "GET", "POST", "PUT", "DELETE", "OPTIONS").maxAge(300).allowedHeaders("Authorization", "Cache-Control", "Content-Type");}여전히 호출 불가 상태로 있는데 원인을 모르겠습니다. 혹시나 몰라 todoApi.js 파일을 제공된 소스파일로 엎어쳐서 진행을 했는데도 불구하고 말이죠..
-
미해결실전! Querydsl
gradle compileQuerydsl 안뜸
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]build.gradle에 작성을 했습니다.plugins { id 'java' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' } group = 'study' version = '0.0.1-SNAPSHOT' 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-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //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() } clean { delete file('src/main/generated') } GradlecompileQueryDsl이 존재하지 않습니다. 라이브러리로는 추가가 되어 있습니다어떻게 해결해야 할까요??
-
미해결코드로 배우는 React with 스프링부트 API서버
연관관계 맵핑에 대해서 질문드립니다.
@ElementCollection와 @EntityGraph사용법에 대해서 잘 숙지 하였습니다. 한가지 질문이 있습니다. JPA사용시 일반적으로 쓰이는 @OneToMany, @ManyToOne, @ManyToMany를 대신해서 @ElementCollection으로대체하여 사용이 가능할까요?왠지 될거같은생각이 들긴하는데....
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
em.persist() 메서드 호출시 id값 얻어오기
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.회원 서비스 개발 4분쯤에 영한님께서 em.persist() 메서드로 영속성 컨텍스트에 인스턴스가 들어가게되면, DB에 들어가기 전에 id(key)에 대한 값이 들어가지게 된다고 하셨는데, 제가 이전에 들었던 부분은 insert쿼리가 나갔다가 저장된 엔티티를 통해서 id값을 받아오는 걸로 알고 있습니다.그래서 JPA 기본편 4챕터를 찾아보니, JDBC3에서 추가된 `Statement.getGeneratedKeys()` 이 메서드를 사용하면, 데이터를 저장하면서 동시에 생성된 기본 키 값도 얻어올 수 있다는 것을 제가 정리해놨었는데, getGeneratedKeys() 메서드가 ResultSet을 반환하던데, 구글링 해보니 ResultSet은 DB에서 조회한 정보가 담겨있는 것이더라구요. 그래서 연결지어서 생각해보니 getGeneratedKeys() 메서드를 호출해서 DB에서 마지막 결과의 id를 조회해서 할당하는 이런 방식으로 동작 하는 건가.. 생각하기도 했지만, 잘 모르겠습니다....ㅎㅎ답변 부탁드리겠습니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문내역관련
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]홈화면에서 상품주문을 여러개 한후 주문내역을 누르면 이렇게 뜨는데 여기서 지금까지 주문한 모든 상품이 뜨는 원리가 궁금합니다. @GetMapping("/orders") public String orderList(@ModelAttribute("orderSearch") OrderSearch orderSearch, Model model) { List<Order> orders = orderService.findOrders(orderSearch); model.addAttribute("orders", orders); return "order/orderList"; }이코드로 볼때 메인 화면에서 주문 내역을 누르면 orderSearch에 필드 값들은 모두 null아닌가요? 그런데 어떻게 order/orderList에는 모든 주문내역이 출력되는지 궁금합니다...!
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
intellij 콩모양 질문
따로 마우스를 올려도 콩모양은 보지지 않는데, ultimate 버전에서 지원되는 기능일까요?
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
혹시 이 강의도 업데이트 예정에 있을까요?
로드맵 따라서 공부하고 있는데, 첫번째 강의처럼 이번 강의도 스프링 부트 3.x대로 업데이트 예정이 있는지 궁금합니다! 언제쯤 업데이트가 될지 알고싶어요..!
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Response DTO VS HTTP Response
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강의 잘 듣고 있습니다.강의 도중 궁금한 점이 생겨 질문드립니다. 강의에서는 POST나 PUT요청에서도 Response DTO 객체를 생성해서 전달하셨는데, 실제 실무에서도 이렇게 하는지 궁금합니다. 질문드린 이유는 HTTP Response code상 201이나 204 등의 응답코드가 있는 것으로 알고있는데, Response를 매번 생성하는게 실질적으로 좋은 설계이기 때문인지, 아니면 변경이 완료된 것을 실제로 조회하면서 이해를 돕기 위함인지 궁금했습니다. 감사합니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
[섹션5: Spring & JPA 기반 테스트] 에서 진행한 테스트는 단위테스트인가요? 통합테스트인가요?
안녕하세요. 현재 섹션 5까지 수강을 하고 헷갈리는 것이 있어 질문 남기게 되었습니다. 섹션 5에서 3개의 레이어에 대한 테스트를 진행하는 데 이 테스트들은 단위 테스트인지 통합 테스트인지 헷갈립니다. @SpringBootTest 어노테이션을 사용하는 것으로 봐서는 스프링 빈을 전부 로드하는 통합테스트 같기도 하면서, @WebMvcTest 어노테이션을 사용하는 것을 봤을 때는 다른 레이어와 독립적인 테스트를 진행하는 것 같아 단위테스트 같은 것 같다고 생각했습니다. 이번 섹션에서 진행한 테스트는 어떤 종류의 테스트인가요? 만약 단위(혹은 통합)테스트라면 다른 종류에 있는 테스트는 어떻게 진행해야 하는지, 아니면 이 테스트만으로 충분하지 궁금합니다.
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
스프링 부트 3.0.1 자바 버전 호환성
A problem occurred configuring root project 'library-app'. > Could not resolve all files for configuration ':classpath'. > Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.1. Required by: project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.0.1 > No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.1 was found. The consumer was configured to find a runtime of a library compatible with Java 11, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.5' but: - Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 declares a library, packaged as a jar, and its dependencies declared externally: - Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 11 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') - Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 declares a runtime of a component, and its dependencies declared externally: - Incompatible because this component declares documentation and the consumer needed a library - Other compatible attributes: - Doesn't say anything about its target Java version (required compatibility with Java 11) - Doesn't say anything about its elements (required them packaged as a jar) - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') - Variant 'mavenOptionalApiElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.1 declares a library, packaged as a jar, and its dependencies declared externally: - Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 11 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') - Variant 'mavenOptionalRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.1 declares a runtime of a library, packaged as a jar, and its dependencies declared externally: - Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') - Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 declares a runtime of a library, packaged as a jar, and its dependencies declared externally: - Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 11 - Other compatible attribute: - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') - Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.1 declares a runtime of a component, and its dependencies declared externally: - Incompatible because this component declares documentation and the consumer needed a library - Other compatible attributes: - Doesn't say anything about its target Java version (required compatibility with Java 11) - Doesn't say anything about its elements (required them packaged as a jar) - Doesn't say anything about org.gradle.plugin.api-version (required '7.5') * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. 수업자료로 제공되는 압축파일을 받았는데요. jdk 11 설치 후 gradle sync를 누르면 위와 같은 에러가 나오는데요. 강의 설명에서는 11을 깔라고 하셔서 진행하는데 잘 안되네요.build.gradle 파일에 다음과 같이 선언되어 있는데, 스프링부트 3.0.1 버전에서는 17이 호환되는 거 같아서 질문드립니다. jdk 17깔고 설정하니 gradle install은 잘 되네요.```plugins { id 'org.springframework.boot' version '3.0.1' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' }```
-
해결됨실전! 스프링 데이터 JPA
단방향 연관관계 때 삭제시 연관된 테이블 모두 삭제 질문
[질문 내용]제가 유저를 삭제해줄 때 그 유저가 작성한 게시글, 댓글, 장바구니를 삭제해주려고 합니다.유저와 게시글, 댓글, 장바구니는 단방향연관관계를 가지고 있도록 구성했는데 그 이유는 양방향은 필요할 때 사용하고 그 외에는 단방향으로 구성하려고 했기 때문인데 유저에 양방향으로 각각의 데이터를 가지고 있을 필요가 없다고 생각해서 단방향으로 했습니다. 제가 알고있기로는 양방향으로 이어져 있으면 등록, 수정, 삭제 할 때 cascade로 처리하고 고아 객체 삭제하는 orphanRemoval = true 을 같이 사용하면 삭제되지만 이것들은 양방향 연관관계 때 사용하고 일대다` 인 부분에서 다쪽에 써야하는 것으로 알고 있습니다. 예를들어, @OneToMany 이렇게 양방향으로 이어져 있으면 이 객체가 다인쪽에 연결하니 이 객체가 다니까 이쪽에 cascade와 orphanRemoval = true를 사용하는걸로 이해하고 있습니다. 단방향에서는 각자의 레포가 별도로 되어 있으니 각각 삭제해주는 걸로 알고 있어서 다음과 같이 별도의 레포에 해당 하는 유저를 모두 삭제하는 방법을 선택했는데 제가 맞는 선택을 했는지 제가 제대로 이해한게 맞는지 궁금합니다. public String removeUser(Long memberId, String email) { // 회원 조회 MemberEntity findUser = memberRepository.findByEmail(email); log.info("email check : " + email); log.info("email check2 : " + findUser.getEmail()); // 회원이 비어있지 않고 넘어온 id가 DB에 등록된 id가 일치할 때 if (findUser.getMemberId().equals(memberId)) { boardRepository.deleteAllByMemberMemberId(memberId); commentRepository.deleteAllByMemberMemberId(memberId); cartRepository.deleteAllByMemberMemberId(memberId); memberRepository.deleteByMemberId(memberId); return "회원 탈퇴 완료"; } else { return "해당 유저가 아니라 삭제할 수 없습니다."; } }
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Enumerated(EnumType.STRING)
@Enumerated(EnumType.STRING) private OrderStatus status; // 주문 상태 [ORDER, CANCEL]db에 Enum 타입을 다룰 때 ordinal이 아닌 문자로 다뤄야 한다는 걸 들은 적이 있는데강의에서도 몇글자 줄이려다가 장애가 발생한다고 말씀하십니다. 그러면 ordinal로 저장하는 이점을 포기하고도 반드시 문자로 저장하는 것인가요? 데이터가 많아지면 불리하지 않은가요
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
spring.start.io 자바버전 11 미지원
자바 버전이 17부터 나오는데, 강의에서는 11로 진행해서 어떻게 진행하면 될지 여쭤봅니다.
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
consumer가 작동하지 않습니다
consumer를 실행시키면WARN [Consumer clientId=console-consumer, groupId=console-consumer-83590] Error while fetching metadata with correlation id 2 : {my_topic_users=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)이게 뜨고 이후에 데이터베이스에 데이터를 넣어도 아무것도 뜨지 않습니다. http://localhost:8083/connectors/my-source-connect/status 실행시키면 이렇게 나옵니다.{ "name": "my-source-connect", "connector": { "state": "FAILED", "worker_id": "", "trace": "org.apache.kafka.connect.errors.ConnectException: java.sql.SQLInvalidAuthorizationSpecException: Could not connect to address=(host=localhost)(port=3307)(type=master) : GSS-API authentication exception\r\n\tat io.confluent.connect.jdbc.util.CachedConnectionProvider.getConnection(CachedConnectionProvider.java:59)\r\n\tat io.confluent.connect.jdbc.JdbcSourceConnector.start(JdbcSourceConnector.java:94)\r\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doStart(WorkerConnector.java:193)\r\n\tat org.apache.kafka.connect.runtime.WorkerConnector.start(WorkerConnector.java:218)\r\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:363)\r\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:346)\r\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:146)\r\n\tat org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:123)\r\n\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\r\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\r\n\tat java.base/java.lang.Thread.run(Thread.java:842)\r\nCaused by: java.sql.SQLInvalidAuthorizationSpecException: Could not connect to address=(host=localhost)(port=3307)(type=master) : GSS-API authentication exception\r\n\tat org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:66)\r\n\tat org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:192)\r\n\tat org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1392)\r\n\tat org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:635)\r\n\tat org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:150)\r\n\tat org.mariadb.jdbc.Driver.connect(Driver.java:89)\r\n\tat java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)\r\n\tat java.sql/java.sql.DriverManager.getConnection(DriverManager.java:190)\r\n\tat io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.getConnection(GenericDatabaseDialect.java:250)\r\n\tat io.confluent.connect.jdbc.util.CachedConnectionProvider.newConnection(CachedConnectionProvider.java:80)\r\n\tat io.confluent.connect.jdbc.util.CachedConnectionProvider.getConnection(CachedConnectionProvider.java:52)\r\n\t... 12 more\r\nCaused by: java.sql.SQLException: GSS-API authentication exception\r\n\tat org.mariadb.jdbc.internal.com.send.authentication.gssapi.StandardGssapiAuthentication.authenticate(StandardGssapiAuthentication.java:169)\r\n\tat org.mariadb.jdbc.internal.com.send.authentication.SendGssApiAuthPacket.process(SendGssApiAuthPacket.java:133)\r\n\tat org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.authenticationHandler(AbstractConnectProtocol.java:752)\r\n\tat org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createConnection(AbstractConnectProtocol.java:553)\r\n\tat org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1387)\r\n\t... 20 more\r\nCaused by: javax.security.auth.login.LoginException: No LoginModules configured for Krb5ConnectorContext\r\n\tat java.base/javax.security.auth.login.LoginContext.init(LoginContext.java:269)\r\n\tat java.base/javax.security.auth.login.LoginContext.<init>(LoginContext.java:357)\r\n\tat org.mariadb.jdbc.internal.com.send.authentication.gssapi.StandardGssapiAuthentication.authenticate(StandardGssapiAuthentication.java:117)\r\n\t... 24 more\r\n" }, "tasks": [], "type": "source" } 강사님이 올려주신 카프카 파일을 사용했어요. 당연하겠지만 이후 sink나 DB연동 강의 따라해도 전혀 작동하지 않습니다..
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
CASCADE와 즉시로딩/지연로딩의 차이
강사님께서 CASCADE와 즉시로딩/지연로딩이 완전히 다른 개념이라고 말씀하셨습니다.즉시로딩/지연로딩 : 연관된 엔티티의 조회 시점 선택CASCADE : 연관된 엔티티의 삽입, 삭제 생명주기 관리이렇게 이해하면 될까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
DB에서 가져온다는 의미는 뭘까요?
간단한 질문일 것 같습니다!지연 로딩, 즉시 로딩이란 결국 DB에 쿼리문을 날려 원하는 데이터를 어느 시점에 가지고 올지 결정하는 거잖아요.그런데 가지고 온다는 의미가 제가 이해하고 있는 것과 맞는지 궁금합니다.DB에서 쿼리문을 통해 데이터를 가지고 오는 것은, 해당 객체(예: Member)의 멤버변수에(name, age, address, Team 타입... 등) 값을 대입한다는 뜻일까요? @Entity public class Member { @Id @GeneratedValue private Long id; private String name; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColum(name = "TEAM_ID") private Team team; ... ) Member member = em.find(Member.class, "1L"); // 실행 코드 위 코드를 예시로 들면, em.find()를 호출했을 때, DB에 저장된 id, name, age 값을 가지고 Member 객체를 만들어 줍니다. 대신, LAZY 로딩이라서 TEAM team 멤버변수엔 프록시 객체를 대신 넣어 주게 됩니다. 나중에 team 멤버변수를 사용할 일이 생기면 그제서야 해당 Member가 가진 Team의 FK를 가지고 조인되는 팀 정보를 조회하는 쿼리를 DB에 보낸다... 제 이해가 맞는지 궁금합니다!추가로,EAGER 로딩인 경우엔 DB에 select * from member; 쿼리문을 한 번만 보냈는데, DB에 저장된 멤버 필드가 10개라면 각각의 멤버의 Team 객체를 조회하는 쿼리문이 +10개가 즉시 DB로 보내지기 때문에 N + 1이 발생한다...이것도 맞는 이해일까요?감사합니다!
-
미해결코드로 배우는 React with 스프링부트 API서버
모달이 뜨질않습니다....
모달이 작동하지않아서 혹시 몰라서 카페에 올라와있는 소스코드를 덮어씌어도 모달이 뜨질않습니다.. 분명 데이터는 등록되는데 result값도 제대로 들어오는데도 불구하고 뜨질않더라구요.. 아래코드는 카페에 올라와있는 코드를 제 프로젝트에 인식시켜본 코드입니다. import React, {useState} from 'react'; import ResultModal from "../common/ResultModal"; import {postAdd} from "../../api/todoApi"; import userCustomMove from "../../hooks/userCustomMove"; const initState = { title:'', content: '', dueDate: '' } const AddComponent = () => { const [todo, setTodo] = useState({...initState}) const [result, setResult] = useState(null) //결과 상태 const {moveToList} = userCustomMove() //useCustomMove 활용 const handleChangeTodo = (e) => { todo[e.target.name] = e.target.value setTodo({...todo}) } const handleClickAdd = () => { //console.log(todo) postAdd(todo) .then(result => { console.log(result) setResult(result.TNO) //결과 데이터 변경 setTodo({...initState}) }).catch(e => { console.error(e) }) } const closeModal = () => { setResult(null) moveToList() //moveToList( )호출 } return ( <div className = "border-2 border-sky-200 mt-10 m-2 p-4"> {/* 모달 처리 */} {result ? <ResultModal title={'Add Result'} content={`New ${result} Added`} callbackFn={closeModal}/>: <></>} <div className="flex justify-center"> <div className="relative mb-4 flex w-full flex-wrap items-stretch"> <div className="w-1/5 p-6 text-right font-bold">TITLE</div> <input className="w-4/5 p-6 rounded-r border border-solid border-neutral-500 shadow-md" name="title" type={'text'} value={todo.title} onChange={handleChangeTodo} > </input> </div> </div> <div className="flex justify-center"> <div className="relative mb-4 flex w-full flex-wrap items-stretch"> <div className="w-1/5 p-6 text-right font-bold">CONTENT</div> <input className="w-4/5 p-6 rounded-r border border-solid border-neutral-500 shadow-md" name="content" type={'text'} value={todo.content} onChange={handleChangeTodo} > </input> </div> </div> <div className="flex justify-center"> <div className="relative mb-4 flex w-full flex-wrap items-stretch"> <div className="w-1/5 p-6 text-right font-bold">DUEDATE</div> <input className="w-4/5 p-6 rounded-r border border-solid border-neutral-500 shadow-md" name="dueDate" type={'date'} value={todo.dueDate} onChange={handleChangeTodo} > </input> </div> </div> <div className="flex justify-end"> <div className="relative mb-4 flex p-4 flex-wrap items-stretch"> <button type="button" className="rounded p-4 w-36 bg-blue-500 text-xl text-white " onClick={handleClickAdd} > ADD </button> </div> </div> </div> ); } export default AddComponent;
-
미해결코드로 배우는 React with 스프링부트 API서버
cors 에러 처리
@RestController @Log4j2 @RequiredArgsConstructor @RequestMapping("/api/todo") @CrossOrigin("*") //cors 허용 public class TodoController { ... }http://localhost:3000/todo/read/33 호출시 cors에러@CrossOrigin("*") 로 일단 처리했습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@MappedSuperclass를 사용한 BasicEntity의 패키지 위치는 어디인가요?
프로젝트를 진행하는데, DDD 방향으로 진행하고자,도메인을 기준으로 패키지를 나누려고 합니다.즉 각각의 도메인(Member, Product 등) 패키지 내부에 dto, controller, repository, service 패키지들이 위치하는 형태입니다. 이런 상황에서 모든 엔티티에 적용되는 BasicEntity 클래스의 위치는 보통 어디에 둬야 하는지 궁금합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
hibernate 생성한 select 쿼리의 team_id, member_id 컬럼 중복
@Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>(); // 아래는 getter, setter } @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Team getTeam() { return team; } public void setTeam(Team team) { this.team = team; } public void changeTeam(Team team){ this.team = team; //연관관계 편의 메소드 team.getMembers().add(this); } } public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { //저장 Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); //member.setTeam(team); //owner에 넣어야 DB 반영됨 member.changeTeam(team); //연관관계 편의 메소드 em.persist(member); Member member1 = new Member(); member1.setUsername("member2"); member1.changeTeam(team); em.persist(member1); em.flush(); em.clear(); Team findTeam = em.find(Team.class, team.getId()); List<Member> members = findTeam.getMembers(); System.out.println("====================="); for (Member m : members) { System.out.println("m = " + m.getUsername()); } System.out.println("====================="); tx.commit(); } catch (Exception e){ tx.rollback(); } finally { em.clear(); } emf.close(); }Team, Member가 양방향 연관관계를 맺고 있는 상태에서 우선 Team을 조회하고 Team의 members를 사용하는 시점에 Member를 조회하는 예시입니다. 처음에는 select m.team_id, m.member_id, m.username from member as m where member.team_id = 1;이런 형태로 select 쿼리가 발생할 것으로 예상했습니다. 하지만 실제 hibernate로 발생한 쿼리를 확인하니 아래와 같은 쿼리가 발생했습니다.Hibernate: select members0_.TEAM_ID as team_id3_0_0_, members0_.MEMBER_ID as member_i1_0_0_, members0_.MEMBER_ID as member_i1_0_1_, members0_.TEAM_ID as team_id3_0_1_, members0_.USERNAME as username2_0_1_ from Member members0_ where members0_.TEAM_ID=?hibernate가 생성한 select쿼리에서 team_id, member_id 컬럼이 두번 나오는 이유가 무엇인가요?