학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의에서 order 테이블을 조회하면 id값이 4, 11로 나오는데 저는 1, 2로 나옵니다. 아무리 생각해봐도 4, 11로 나올 이유가 없어보이는데 왜 4,11로 나오는지 궁금합니다
안녕하세요. 강사님 05:00 분에 WAR를 설명하십니다. WAR : 정적리소스(HTML) + 클래스파일 이라고 설명하십니다. JAR 도 WAR와 마찬가지로 위와같이 HTML, 클래스파일을 갖을 텐데요. 강사님께서는 HTML을 WAR설명때만 언급을 하십니다. WAR 와 JAR가 갖는 파일들에 대해 차이점을 구별하지 못하고 있습니다. 단순 내부구조가 복잡하거나 단순한 걸로 구별을 해야할까요?
안녕하세요 비슷한 이유로 queryDSL 에서 불편함을 가지고 있어 jOOQ 에 관심이 생겼습니다. 마침 이렇게 좋은 강의 만들어주셔서 정말 감사합니다. 다름이 아니라 kotlin 을 주로 사용해서 kotlin 으로 jOOQ 사용시 컴파일 단계에서 힙메모리 부족 현상이 생기는데 혹시 kotlin 으로 힙메모리 부족 현상을 겪으신 적 있으신가요 만약 있으시면 해결하신 지혜를 얻고 싶어 글 남깁니다 gradle 설정은 아래와 같이 했습니다 해결과정 동안 힙메모리 설정 추가하여 늘려봐도 메모리 부족 현상이 발생하네요 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile val jooqVersion: String by extra("3.19.5") plugins { kotlin("jvm") version "1.9.25" kotlin("plugin.spring") version "1.9.25" id("org.springframework.boot") version "3.4.0" id("io.spring.dependency-management") version "1.1.6" id("nu.studer.jooq") version "9.0" } group = "com.example" version = "0.0.1-SNAPSHOT" java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } repositories { mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boot-starter-jooq"){ exclude(group = "org.jooq", module = "jooq") } implementation("org.jooq:jooq:$jooqVersion") // jOOQ implementation(project(":jOOQ-custom")) jooqGenerator (project(":jOOQ-custom")) jooqGenerator("org.jooq:jooq:$jooqVersion") jooqGenerator("org.jooq:jooq-meta:$jooqVersion") implementation("org.jetbrains.kotlin:kotlin-reflect") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } kotlin { compilerOptions { freeCompilerArgs.addAll("-Xjsr305=strict") } } tasks.withType<Test> { useJUnitPlatform() } val dbUser: String = System.getProperty("db-user") ?: "root" val dbPassword: String = System.getProperty("db-password") ?: "passwd" jooq { version.set(jooqVersion) configurations { create("sakilaDB") { generateSchemaSourceOnCompilation.set(true) jooqConfiguration.apply { logging = org.jooq.meta.jaxb.Logging.WARN jdbc.apply { driver = "com.mysql.cj.jdbc.Driver" url = System.getenv("DB_URL") ?: "jdbc:mysql://localhost:3306/sakila" user = dbUser password = dbPassword } generator.apply { name = "org.jooq.codegen.KotlinGenerator" database.apply { name = "org.jooq.meta.mysql.MySQLDatabase" excludes = "sys" } generate.apply { isDaos = true isRecords = true isFluentSetters = true isJavaTimeTypes = true isDeprecated = false } target.apply { directory = "src/generated" } strategy.name = "com.example.jooq.custom.generator.JPrefixGeneratorStrategy" } } } } } sourceSets { main { java { srcDirs("src/main/kotlin", "src/generated") } } }
안녕하세요. 그런데 섹션3 의 'Querydsl 검색처리' 영상을 다 보고 TDD 테스트를 돌리는데 계속 아래와 같은 에러가 납니다.. 몇일동안 찾아봤는데도 아예 해결이 되지 않아서 여기에 질문드리게 됐네요.. ㅠㅠ 혹시 몰라 콘솔탭에 있는거 전부 다 복사해 왔습니다. 강의를 파트별로 정리하면서 공부하고 있어서 앞에 Ex01 이런식으로 이름이 붙어 있습니다. 왜 안되는지 도저히 모르겠어요.. (게시글이 10000자 이상 안써진다고 해서 댓글에 다음 메세지들 쓰겠습니다.) (혹시 몰라서 대댓글로 코드들도 남깁니다.) . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.3.6) 2024-12-02T05:13:22.977+09:00 INFO 7780 --- [ restartedMain] c.zerock.apiserver.ApiserverApplication : Starting ApiserverApplication using Java 17.0.13 with PID 7780 (C:\Users\hykim\Desktop\apiserver\build\classes\java\main started by hykim in C:\Users\hykim\Desktop\apiserver) 2024-12-02T05:13:22.993+09:00 INFO 7780 --- [ restartedMain] c.zerock.apiserver.ApiserverApplication : No active profile set, falling back to 1 default profile: "default" 2024-12-02T05:13:23.010+09:00 INFO 7780 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable 2024-12-02T05:13:23.010+09:00 INFO 7780 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' 2024-12-02T05:13:23.322+09:00 INFO 7780 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2024-12-02T05:13:23.353+09:00 INFO 7780 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 28 ms. Found 1 JPA repository interface. 2024-12-02T05:13:23.632+09:00 INFO 7780 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) 2024-12-02T05:13:23.638+09:00 INFO 7780 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2024-12-02T05:13:23.638+09:00 INFO 7780 --- [ restartedMain] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.33] 2024-12-02T05:13:23.665+09:00 INFO 7780 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2024-12-02T05:13:23.665+09:00 INFO 7780 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 655 ms 2024-12-02T05:13:23.733+09:00 INFO 7780 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2024-12-02T05:13:23.761+09:00 INFO 7780 --- [ restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.3.Final 2024-12-02T05:13:23.777+09:00 INFO 7780 --- [ restartedMain] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled 2024-12-02T05:13:23.936+09:00 INFO 7780 --- [ restartedMain] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer 2024-12-02T05:13:23.951+09:00 INFO 7780 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2024-12-02T05:13:23.989+09:00 INFO 7780 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.mariadb.jdbc.Connection@6303bda2 2024-12-02T05:13:23.990+09:00 INFO 7780 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2024-12-02T05:13:24.411+09:00 INFO 7780 --- [ restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) 2024-12-02T05:13:24.438+09:00 INFO 7780 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2024-12-02T05:13:24.535+09:00 WARN 7780 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ex04_10_TodoServiceImpl' defined in file [C:\Users\hykim\Desktop\apiserver\build\classes\java\main\com\zerock\apiserver\service\Ex04_10_TodoServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'ex04_13_TodoRepository' defined in com.zerock.apiserver.repository.Ex04_13_TodoRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract org.springframework.data.domain.Page com.zerock.apiserver.repository.search.Ex04_11_TodoSearch.search1(com.zerock.apiserver.dto.Ex04_7_PageRequestDto); Reason: Paging query needs to have a Pageable parameter; Offending method: public abstract org.springframework.data.domain.Page com.zerock.apiserver.repository.search.Ex04_11_TodoSearch.search1(com.zerock.apiserver.dto.Ex04_7_PageRequestDto) 2024-12-02T05:13:24.535+09:00 INFO 7780 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2024-12-02T05:13:24.537+09:00 INFO 7780 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2024-12-02T05:13:24.538+09:00 INFO 7780 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 2024-12-02T05:13:24.539+09:00 INFO 7780 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2024-12-02T05:13:24.545+09:00 INFO 7780 --- [ restartedMain] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2024-12-02T05:13:24.556+09:00 ERROR 7780 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ex04_10_TodoServiceImpl' defined in file [C:\Users\hykim\Desktop\apiserver\build\classes\java\main\com\zerock\apiserver\service\Ex04_10_TodoServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'ex04_13_TodoRepository' defined in com.zerock.apiserver.repository.Ex04_13_TodoRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract org.springframework.data.domain.Page com.zerock.apiserver.repository.search.Ex04_11_TodoSearch.search1(com.zerock.apiserver.dto.Ex04_7_PageRequestDto); Reason: Paging query needs to have a Pageable parameter; Offending method: public abstract org.springframework.data.domain.Page com.zerock.apiserver.repository.search.Ex04_11_TodoSearch.search1(com.zerock.apiserver.dto.Ex04_7_PageRequestDto) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:795) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1375) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1212) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975) ~[spring-beans-6.1.15.jar:6.1.15] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:971) ~[spring-context-6.1.15.jar:6.1.15] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.15.jar:6.1.15] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.6.jar:3.3.6] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.6.jar:3.3.6] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.6.jar:3.3.6] at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.6.jar:3.3.6] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.6.jar:3.3.6]
안녕하세요 지식공유자님. 강의에서 JwtProvider 에 @Component 어노테이션을 선언하셔서 스프링이 관리하도록 의도하신 것 같습니다. 그런데, 함수에 static 을 모두 붙이시고, 사용하는 쪽에서는 bean 으로 등록 하지 않고 static util 처럼 사용하시는 것을 확인했습니다. 질문은 두가지 입니다. @Component 를 선언하셨음에도 static 메서드를 authService 에서 사용하신 이유가 있으신지. 빈으로 만들고서도 static 함수로 사용하는 것에 이점이 있는 것인지. 답변 부탁드리겠습니다. 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. @PatchMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMember(@PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest updateMemberRequest) { 수정 api는 위와 같은 주소를 이용합니다. 근데 사실 UpdateMemberRequest에 id라는 필드를 넣고 주소를 /api/v2/members 로 둬도 상관 없지 않나요? id를 PathVariable로 뺀 이유가 궁금합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 엔티티를 api로 넘겨주면 엔티티가 수정됐을때 api가 오염될 수 있는 문제가 있어서 응답에 DTO를 보내준다고 이해했습니다. 근데 이 문제는 탬플릿 엔진을 사용해 화면을 출력할때도 문제가 되지 않나요? 1편에서 타임리프에 값을 넣을때는 DTO를 이용하지 않은 이유가 궁금합니다. 혹시 컴파일 단계에서 오류가 나기 때문인가요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? ( 예 /아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ( 예 /아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 /아니오) [질문 내용] 어느 순간 갑자기 hello-spring 프로젝트를 켰을때 실행버튼이 안눌리고 HelloSpringApplication에서도 메서드에 재생 버튼이 안뜹니다. 왜그러죠? edit configuartion 해야하나요
>java -jar jpashop-0.0.1-SNAPSHOT.jar 하는 단계에서 계속 오류가 납니다... Web server failed to start. Port 8080 was already in use. 라고요... 8080포트가 사용중이라는데 cmd 관리자권한으로 실행해서 8080의 pid 는 찾아도 taskkill 이 안돼요 이렇게 뜨고 인터넷창에서 8080 접속하면 static 폴더 안에 있는 파일인 이 페이지가 떠요.... 왜이럴까요? 계속 해도 안되네요....
https://www.inflearn.com/community/questions/48156/aop-timetraceaop-%EB%A5%BC-component-%EB%A1%9C-%EC%84%A0%EC%96%B8-vs-springconfig%EC%97%90-bean%EC%9C%BC%EB%A1%9C-%EB%93%B1%EB%A1%9D @Configuration 파일 내에서 @Bean 어노테이션을 사용하여 TimeTraceAop.java 파일을 빈으로 등록하는 경우, 참조 문제가 발생하는 부분에 대해 위 다른 분이 작성해주신 글을 통해 이해가 잘 갔는데요, 그럼 @Component 어노테이션을 활용하여 등록하는 경우에는 동일한 @Around 구문을 통해 명시된 @Around("execution(* hello.hellospring..*(..))")를 사용하는 경우 문제가 발생하지 않는 것인지 궁금합니다.
https://drive.google.com/file/d/1M-NYH5etfTZPV5kMZzuiOWaBjA7bR3XR/view?usp=sharing 위는 제 프로젝트 파일입니다 강의 파일에 나와있는부분을 복붙해도 오류나고 testImplementation("junit:junit:4.13.2") 이렇게 해도 오류납니다. Assert 부터 안되는데 뭐가 잘못된걸까요?
배운거를 적용하면서 쿼리 개선을 하고 있었는데, 혼자 해결해보려고 했으나 컬렉션 조회가 같이 섞이면서 이해가 잘 안 되는 것 같아 질문을 남기게 되었습니다. 게시글 목록을 불러올때 태그이름 리스트를 같이 필요하기 때문에 관련 memePostTags와 Tag까지 같이 조회를 해야하는 상황입니다. 테이블 관계가 MemePost 1 : N MemePostTag 1 : 1 Tag 이렇게 되어있을때 getMemePost5 메서드와 getMemePost6메서드 둘 중에 어느 것이 더 나은 방법인지, 아니면 더 나은 다른 방법이 있는지 궁금합니다. getMemePost5의 경우는 MemePostTagRepository에서 Tag까지 fetch join으로 불러오고, Map 객체에 postId를 key로 저장해서 태그 이름을 조회합니다. getMemePost6의 경우는 페이징으로 조회한 후 postIds를 in절로 postTag와 tag를 fetch join합니다. 컬렉션 조회의 경우 페이징을 안할 경우 fetch join으로, 페이징을 할 경우 batch size로 하라는 것까지는 이해가 되었는데, 이 경우에는 postTags를 batch size로 가져오고, 그에 다한 tag도 batchsize로 가져와 추가로 두번의 쿼리가 더 나가게 되어서 다른 방법을 고안해내다가 점점 미궁으로 빠지는 것 같아서 질문을 남기게 되었습니다 😂 public Slice<MemePostSummaryResponse> getMemePosts5(int page, int size, MemePostSort postSort, Long userId) { Pageable pageable = PageRequest.of(page, size, postSort.toSort()); Slice<MemePost> memePostSlice = memePostRepository.findSliceAll(pageable); List<Long> postIds = getPostIds(memePostSlice.getContent()); // MemePostTag와 Tag를 한번에 fetch join 하나의 쿼리로 하되, MemePostTagRepository에서 entitygraph를 통해 fetch join Map<Long, List<String>> postTagNames = memePostTagRepository.findTagsByMemePostIdIn(postIds) .stream() .collect(groupingBy(tag -> tag.getMemePost().getId(), mapping(tag -> tag.getTag().getName(), toList()))); //좋아요도 하나의 쿼리로 Set<Long> likedPostIds = new HashSet<>(memePostRepository.findLikedPostIds(postIds, user)); List<MemePostSummaryResponse> responses = memePostSlice.getContent().stream() .map(mp -> new MemePostSummaryResponse( mp, likedPostIds.contains(mp.getId()), postTagNames.getOrDefault(mp.getId(), Collections.emptyList()) )) .toList(); return new SliceImpl<>(responses, pageable, memePostSlice.hasNext()); } public Slice<MemePostSummaryResponse> getMemePosts6(int page, int size, MemePostSort postSort, Long userId) { Pageable pageable = PageRequest.of(page, size, postSort.toSort()); Slice<MemePost> memePostSlice = memePostRepository.findSliceAll(pageable); List<Long> postIds = getPostIds(memePostSlice.getContent()); // MemePostTag와 Tag를 한번에 fetch join memePostRepository.findAllWithTagsInPostIds(postIds); //좋아요도 하나의 쿼리로 Set<Long> likedPostIds = new HashSet<>(memePostRepository.findLikedPostIds(postIds, user)); List<MemePostSummaryResponse> responses = memePostSlice.getContent().stream() .map(mp -> new MemePostSummaryResponse( mp, likedPostIds.contains(mp.getId()), mp.getTagNames() )) .toList(); return new SliceImpl<>(responses, pageable, memePostSlice.hasNext()); } public interface MemePostRepository extends JpaRepository<MemePost, Long>, MemePostRepositoryCustom { @Query("SELECT mp FROM MemePost mp where mp.deletedAt IS NULL") Slice<MemePost> findSliceAll(Pageable pageable); @Query("SELECT mp.id FROM MemePost mp " + "JOIN MemePostLike mpl ON mpl.memePost = mp " + "WHERE mp.id IN :postIds AND mpl.user = :user") List<Long> findLikedPostIds(@Param("postIds") List<Long> postIds, @Param("user") User user); @Query("SELECT mp FROM MemePost mp " + "LEFT JOIN FETCH mp.memePostTags mpt " + "LEFT JOIN FETCH mpt.tag " + "WHERE mp.id In :postIds") List<MemePost> findAllWithTagsInPostIds(@Param("postIds") List<Long> postIds); } public interface MemePostTagRepository extends JpaRepository<MemePostTag, Long> { @EntityGraph(attributePaths = {"tag"}) List<MemePostTag> findAllByMemePostId(Long postId); @EntityGraph(attributePaths = {"tag"}) List<MemePostTag> findTagsByMemePostIdIn(List<Long> memePostIds); } public class MemePost { public List<String> getTagNames() { return memePostTags.stream() .map(mpt -> mpt.getTag().getName()) .toList(); } }
[질문 내용] 안녕하세요, 강의 중에 궁금한점이 있어 글 남깁니다. 스프링 부트 스타터에 톰캣이 인베디드 되어서 저절로 가져오기 때문에 서버에 따로 톰캣을 설치할 필요가 없다고 하셨는데, 그렇다면 각 프로젝트를 서버에 띄우게 되면 모두 톰캣이 멀티 인스턴스로 띄우고 각 프로젝트는 모두 다른 포트를 사용해야하는걸까요? 만약 그렇다면 각 프로젝트에 톰캣 포트 세팅을 따로 해주어야하는데 해당 부분은 서버에서 하는게 아닌 프로젝트를 배포할때 세팅 파일에 따라 세팅이 되는 걸까요?
안녕하세요 지식공유자님. User 클래스의 credentials 필드에 lazy loading 관련하여 설명을 해주셨는데요, 제가 알기로는 mappedBy 가 있는 쪽에서는 LAZY 로딩이 동작하지 않는 것으로 알고 있습니다. 즉, 연관관계의 주인인 UserCredentails 쪽에만 적용하는 것이 맞다고 생각이 드는데 제 생각이 맞을까요?