묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
20강 강의 내용중 Interface 만드는 부분에서 질문이 있어요
Interface 만드는 중에 메서드 정의할때 public은 추상 메서드라면 지우셨는데 추상 메서드는 public을 왜 지워야 하나요? 아니면 안 지워도 되는데 어떤 이유로 인해 지운건가요?
-
미해결실전! 스프링 데이터 JPA
순수 JPA 리포지토리 코드 수정부분
[질문 내용]메소드 이름으로 쿼리 생성 챕터의 첫 예제 코드에서JPA로 직접 작성한 findByUsernameAnd... 메서드 내부createQuery 부분에서 Member.class 를 파라미터로 같이 전달해야 할 것 같아서 글 작성합니다
-
미해결Spring Boot TDD - 입문부터 실전까지 정확하게
"오해: 단위 테스트와 통합 테스트를 잘 분리해야한다." 에 대한 질문
안녕하세요. 강의를 듣다 아래와 같은 내용에 대해 개인적인 생각이 있고, 이 생각에 대해 강사님의 생각이 궁금하여 질문 글 올립니다. "오해: 단위 테스트와 통합 테스트를 잘 분리해야한다." 저 또한, 단위 테스트와 통합 테스트를 분명하게 구분하기에는 모호한 부분이 있다고 생각합니다. 하지만, 저는 이를 분리해서 테스트를 진행하고자 합니다.명확한 합의는 없으나, 팀 내 혹은 저에게 있어 단위 테스트와 통합 테스트를 아래와 같이 구분하고자 했습니다.단위 테스트 : 외부의 영향이 존재 하지 않고 가장 작은 단위로써 해당 부분 내에서만 테스트를 진행.통합 테스트 : 외부의 영향까지 반영하여 테스트. 스프링부트 테스트, JPA 테스트 등 이렇게 분리해서 테스트를 진행하고자 하는 이유는 다음과 같습니다.테스트에 대한 빠른 피드백테스트 할 때 빠른 피드백과 빠른 수정이 필수라고 생각합니다. 단위 테스트의 경우 외부 영향 없이, mock을 통해 빠르게 내가 목록화한 테스트를 진행하며, CI 환경에서도 빠르게 피드백을 받을 수 있습니다.반면, 통합 테스트의 경우 비교적 시간 소비가 많이 됩니다. 스프링부트 테스트의 경우 비교적 적은 시간이 소비되지만, JPA 테스트와 같이 디비에 대한 테스트 혹은 다른 플랫폼( 예 : 키클락 등)을 진행하기 위해서는 테스트 컨테이너와 같은 도구를 활용할 수 있다고 생각합니다. 이러한 도구를 사용함에 있어서 많은 시간이 소비가 될 가능성이 크다고 생각합니다.특히 저희 회사의 경우 테스트 환경이 많이 좋지 않아 시간이 훨씬 더 많이 걸리게 됩니다.그래서 저는 단위 테스트랑 통합 테스트를 분리하여 개발 환경에서는 단위 테스트를, 운영 CI 환경에서는 단위 + 통합을 함께하여 테스트를 진행하고 있습니다. 이렇게 분리해서 진행하는 것은 나름 장점이 보이고 있다고 생각하는데 이 부분에 대해 강사님의 의견과 잘못된 부분이 있다면 피드백 부탁드립니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
소셜 로그인 질문 있습니다
social 유저는 기존 회원보다 위험한 유저이므로 회원 정보 수정 페이지로 이동시켜야 한다 라고 하셨는데 이유가 뭔가요??
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
카프카 이외의 메시지 큐 사용
완강하고 갑자기 생각난 질문입니다만, 이번 강의에서 카프카 아닌 rabbitmq 와 같은 다른 메시지 큐를 사용한다면 어떨까요? 어차피 거의 사용용도가 같다면 크게 달라지는 부분은 없을지 고견 부탁드립니다.
-
해결됨실전 jOOQ! Type Safe SQL with Java
generate dao 를 통한 삽입 시 pk auto-increment 가 적용되지 않습니다
Kotlin, Groovy gradle, PostrgreSQL 기반으로 프로젝트 세팅이 되어 있습니다 @Repository class ActorRepository( private val dsl: DSLContext, configuration: Configuration ) { private val actorDao = ActorDao(configuration) companion object { private val ACTOR = JActor.ACTOR } fun save(actor: Actor): Unit = actorDao.insert(actor) }이러한 방식으로 Repository 가 구현되어 있을 때, @SpringBootTest class ActorRepositoryTest( private val actorRepository: ActorRepository, ): StringSpec({ "insert test" { val actor = Actor().apply { firstName = "John" lastName = "Doe" } println("Actor before insert: $actor") val insertedActor = actorRepository.save(actor) } }) { override fun extensions() = listOf(SpringExtension) } 위 쿼리가 실행됩니다제가 예상했던 insert into "actor" ("first_name", "last_name") values(?, ?) 과는 다르게 id 값이 0으로 고정되어 생성되더라구요generate dao 를 생성하는 방법이 잘못된 걸까요?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
페이징 조건시 조회수 정렬 기능 질문
강사님 안녕하세요.게시판 조회시 페이징으로 처리할때 조회수를 오름차순, 내림차순 정렬하는 기능이 있다면 현재 강의 설계 기준으로 어떻게 구현할 수 있을까요? 제가 생각한 방법은 다음과 같습니다.사전 조건:view에서 조회수 데이터는 redis를 바라봄개수 백업 적용 / 단위는 10페이징 쿼리에서 RDB 백업 테이블의 조회수 기준으로 정렬코드 레벨에서 redis 데이터 기준으로 한번 더 정렬 문제는, 2번에서 한 페이지의 데이터만 정렬이 되기 대문에 페이지를 넘어갈때 정렬이 깨지는 현상이 발생합니다 ㅠ 데이터 전체를 메모리에 한번에 조회하지 않고 할 수 있는 방법이 있을까요?
-
미해결스프링부트를 활용한 RESTFUL API 만들기(AWS,EKS)
저는 맥북인데 이건 그냥 윈도우용으로만 수업하시네요
저는 맥북인데 이건 그냥 윈도우용으로만 수업하시네요 이거 지금 처음 1화? 듣고 있는데 슬슬 걱정되네요 돈낭비 아닌가 하고 맥북이라서 뭘 어떻게 해야 하는지 잘 모르겠는데요 -_-
-
미해결RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
인증 에러
학습중 궁금한 것은 언제든 문의 하세요.질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다.추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다.application.ymlspring: application: name: HelloMessageQueue rabbitmq: host: localhost port: 5672 username: admin password: admin server: port: 8080 docker-compose.ymlservices: rabbitmq: image: rabbitmq:3-management container_name: mq ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_ERLANG_COOKIE: rabbitmqCookie RABBITMQ_DEFAULT_USER: admin RABBITMQ_DEFAULT_PASS: admin이렇게 해서 실행하면2025-08-08T11:17:15.145+09:00 ERROR 11684 --- [HelloMessageQueue] [ restartedMain] o.s.boot.SpringApplication : Application run failedorg.springframework.context.ApplicationContextException: Failed to start bean 'container' at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:408) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:394) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:586) ~[spring-context-6.2.9.jar:6.2.9] at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na] at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:364) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:310) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:1006) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:630) ~[spring-context-6.2.9.jar:6.2.9] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.5.4.jar:3.5.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.5.4.jar:3.5.4] at com.study.rabbitmq.RabbitmqApplication.main(RabbitmqApplication.java:10) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) ~[spring-boot-devtools-3.5.4.jar:3.5.4]Caused by: org.springframework.amqp.AmqpIllegalStateException: Fatal exception on listener startup at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.waitForConsumersToStart(SimpleMessageListenerContainer.java:643) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doStart(SimpleMessageListenerContainer.java:603) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:1417) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:405) ~[spring-context-6.2.9.jar:6.2.9] ... 19 common frames omittedCaused by: org.springframework.amqp.rabbit.listener.exception.FatalListenerStartupException: Authentication failure at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:631) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1482) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1322) ~[spring-rabbit-3.2.6.jar:3.2.6] at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]Caused by: org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile. at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:64) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:632) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:726) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.createConnection(ConnectionFactoryUtils.java:257) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$RabbitResourceFactory.createConnection(ConnectionFactoryUtils.java:345) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:140) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:102) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:85) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:625) ~[spring-rabbit-3.2.6.jar:3.2.6] ... 3 common frames omittedCaused by: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile. at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:395) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1251) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1198) ~[amqp-client-5.25.0.jar:5.25.0] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connectAddresses(AbstractConnectionFactory.java:678) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connect(AbstractConnectionFactory.java:647) ~[spring-rabbit-3.2.6.jar:3.2.6] at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:593) ~[spring-rabbit-3.2.6.jar:3.2.6] ... 10 common frames omitted 이 에러가 발생합니다계정도 있는데 인증이 안되는 이유를 모르겠습니다
-
해결됨Spring Boot TDD - 입문부터 실전까지 정확하게
아키텍처 개선
안녕하세요.양질의 강의 덕분에 제한된 시야에서 새로운 인사이트를 얻을 수 있었습니다.섹션 18 - 안정감 있는 아키텍처 개선 챕터를 수강하고 있으며, 현재까지 강의를 들으면서 궁금 했던 내용 두 가지를 여쭈어보고 싶습니다. 질문 1."TDD를 사용해 만들어진 먹구름 아키텍처를 어느 시점에서 개선 해야 할까요?"질문을 하게 된 계기는 전형적으로 많이 사용되는 레이어드 아키텍처를 첫 기능 구현 단계에서 부터 차용하여 개발을 진행 해왔는데, 왜 이 아키텍처를 사용했을까? 란 의문이 없었거든요.강의에서는 흔히 말해 스마트 UI 패턴으로 요구사항을 충분히 충족 해오며 점진적으로 개선 해왔습니다.그러다 모종의 이유로 내부 아키텍처를 개선 하면서 진행이 되었는데, 아키텍처를 개선 해야겠다고 느끼는 요소가 무엇인지 궁금합니다.요구사항이 추가 되었을 때 개발 비용을 최소화 하여 충족 시킬 수 있는가? 라고 생각을 하고 있는데, 현재 까지 불편함을 느낄 정도의 확장성을 강요 받아본 적 없어서 감을 못 잡는 것 같습니다. 질문 2."어떤 영역을 대상으로 테스트를 작성해야할까?"- 테스트 코드 작성 범위 고민위 질문 내용과 답변을 보고 무언가 감이 오는 듯 하나, 아직 정리되지 않는 느낌입니다.API 계층의 동작이 가볍다 또는 무겁다의 판단 기준 API 계층의 동작이 가벼운지 무거운지에 대한 판단은 어떻게 하시는지 궁금합니다.해당 강의에선 API 계층의 동작이 가벼웠기 때문에 API 스펙에 인수테스트를 진행 한 것 같습니다. 서비스 대상으로 테스트를 많이 실행하고, API 는 간단한 성공 경우에 테스트를 한다. 이 케이스에선 아래와 같은 테스트 시나리오가 있다고 가정한다면 테스트를 어떻게 하면 좋을까요?- username 속성이 null 이거나 공백이라면 HasUsernameNullOrEmpty 예외를 반환한다 - username 속성이 올바른 형식을 따르지 않으면 InvalidUsername 예외를 반환한다 - username 속성이 올바른 형식을 따르면 User 객체를 생성한다서비스 테스트에서 위 3가지 케이스에 대해 검증인수 테스트에서 username 을 정확히 입력한 경우 상태코드와 유저에 대한 정보를 반환 하는지 검증 이렇게 테스트를 구성한다고 이해 했는데 제대로 이해한걸까요? 다시 한 번 질문을 빌미로 감사 인사를 드리면서 고견 부탁드리겠습니다.항상 건강하세요!
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
JWT 설정 후 JSON 데이터가 문자열로 옵니다...
📤 before requestjwtUtil.ts:30 ✅ Response ReceivedjwtUtil.ts:34 📦 Content-Type: application/jsonjwtUtil.ts:35 🧾 typeof res.data: stringcontent-type은 json 형식으로 맞춰 주었는데 정작 데이터가 String으로 와서 list에 뿌려주지를 못하고 있습니다.Postman으로 확인했을 때는 정상적으로 JSON 데이터를 반환받는데 리액트에서 확인할려면 res.data가 "{\"dtoList\":[{\"tno\":115,\"title\":\"123zzzㅋㅋㅋㅋ\",\"content\":null,\"complete\":false,\"dueDate\":\"2025-08-07\",\"writer\":\"123\"}위와 같이 스트링 형식으로 변환되어서 들어와서 오류가 생깁니다.어디가 문제일까요..ㅠㅠ
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
loginSlice에서 reject가 반환되지 않습니다.
로그인시에 잘못된 아이디 비밀번호를 넣게 되면 콘솔 로그 창에 reject가 반환되어야 하는데 전부 fulfilled로 반환됩니다. 혹시 코드 필요하시면 첨부하도록 하겠습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
IntelliJ 초기 설치 파일 설치 실패
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]IntelliJ에서 hello-spring 프로젝트 열고 혼자 알아서 설치하더니 갑자기 이렇게 오류 뜨면서 아무것도 안되길래,,, 챗지피티한테 물어봤어용 그랬더니 build.gradle 파일에서 java { toolchain { languageVersion = JavaLanguageVersion.of(17) }}이 부분을 주석 처리 하라길래 주석 처리하고 재시작했더니 오류가 안뜨네욤 그냥 주석처리 해도 괜찮은 부분인가요?
-
미해결스프링 부트 - 핵심 원리와 활용
localhost:8080/hello-servlet 404오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오)[질문 내용]제가 윈도우 환경에서 강의 내용 대로 container/AppInitcontainer/AppInitV1Servletcontainer/MyContainerInitV1servlet/HelloServletservlet/TestServlet를 작성하고 그 외 html이나 jarkarta.servlet.ServletContainerInitializer도 물론 다 작성한 상태에서 localhost:8080/hello-servlet 해당 url로 이동하면 404 오류가 뜹니다 혹시나 제가 잘못 코드르 작성했나 싶어서 강의 자료의 complete안의 server를 압축 풀고 앞서 말씀드린 해당 클래스만 남기고 다 지우고 gradlew explodedWar을 실행하고 톰캣 설정했는데도 똑같이 404오류가 떠서 질문드립니다 바뀐 점은 스프링 3.x버전 그리고 gradle 8.5인데 왜 이렇게 되는 걸까요...?(물론 클래스가 다 작성된 상태에서는 잘 호출됩니다)
-
미해결실전! 스프링 데이터 JPA
bulk연산 후 flush하는 이유를 모르겠어요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 bulk연산을 하면 영속성 컨텍스트의 내용을 flush하는 동시에 영속성 컨텍스트의 내용을 변경하지 않고 DB에서 값을 변경해버려서 1차 캐시와 데이터가 다르게 된다고 이해했습니다.그렇다면 bulk연산 할 때 기존에 1차캐시 값들을 flush한다고 이해를 했습니다. 그런데 저희 코드에서 벌크한 뒤에 flush와 clear를 해주는데 clear만 해주면 되는 것 아닌가요?
-
미해결스프링 부트 - 핵심 원리와 활용
내장톰캣2 서블릿 톰켓 실행이 안됩니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.섹션 4 내장톰켓2 -서블릿 강의를 진행중인데요 강사님하고 똑같이 진행하는데 run이 실행되지 않습니다gpt에 물어봐도 내장 톰캣을 실행할 때, 웹 애플리케이션 리소스 경로(webapps 디렉토리)를 찾지 못해서 발생한 에러하는데 해결이안되는데 어떻게 하나요?이건 내장 톰캣을 실행할 때, 웹 애플리케이션 리소스 경로(webapps 디렉토리)를 찾지 못해서 발생한 에러예요.정확히 말하면 다음과 같은 톰캣 리소스 설정 오류입니다.❗ 요약해서 말하면톰캣이 시작되긴 했지만, 웹 애플리케이션 루트를 지정한 경로가 실제로 없어서 톰캣 내부에서 시작 실패 → 전체 애플리케이션 실패가 된 상황입니다.🔍 대표 에러 메시지Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\Users\c91sy\IdeaProjects\boot-source-20230228\start\embed\tomcat.8080\webapps\] is not a directory or war file, or is not readable 톰캣이 저 경로(webapps)를 "웹 루트"로 사용하려 했는데:디렉토리가 없거나,접근 권한이 없거나,읽을 수 없는 파일이거나 해서톰캣의 StandardRoot 객체 생성이 실패한 겁니다.🛠 이 에러 이름을 붙이자면:✅"Tomcat 리소스 경로 오류 (Missing or invalid docBase for embedded Tomcat)"또는✅"내장 톰캣 구동 실패 - 웹 리소스 경로 없음 오류"✅ 해결 방법 (정리)경로 확인 및 생성다음 경로 확인:C:\Users\c91sy\IdeaProjects\boot-source-20230228\start\embed\tomcat.8080\webapps 이 경로가 존재하지 않으면 만들어줘야 함.mkdir C:\Users\c91sy\IdeaProjects\boot-source-20230228\start\embed\tomcat.8080\webapps 또는 코드 수정EmbedTomcatServletMain.java 내에 톰캣에 docBase를 지정하는 부분이 있다면, 그 경로를:String webAppPath = "src/main/webapp"; context.setDocBase(new File(webAppPath).getAbsolutePath()); 처럼 실제 존재하는 디렉토리로 바꾸는 것도 방법입니다.✨ 참고로이건 빌드 에러나 문법 오류가 아니라, 실행 시 발생한 런타임 에러입니다.따라서 코드 컴파일은 잘 됐지만, 톰캣 구동 중 내부 리소스 설정 오류로 인해 실패한 것이죠.강사님 코드랑 달리 경로를 추가하라는것 같은데 ,,,에러 메시지는 너무 길어서 천자가 넘어서 어떻게 해야할지 모르겠습니다 ....
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
앱 서비스일 경우
안녕하세요. 이번에 강의 수강을 시작하였습니다. 급하게 앱 프로젝트에서 채팅 서비스 구현을 맡게 되어서 강의를 수강하게 되었는데요, 지금 이 강의는 웹에서 채팅을 구현하는데, 앱에서 구현하게된다고 해도 백엔드 부분은 동일한건가요? 차이점이 있다면 알려주시면 감사하겠습니다
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
안녕하세요 API 테스트 하는 부분에서 질문 있습니다.
안녕하세요 !선생님 코드를 보면 댓글 서비스에서 댓글을 생성할때 request로 들어온 articleId 나 writerId에 대해서 실제로 데이터 베이스에 있는지 검증하는 부분이 없는데,이렇게 구현을 하면 확실히 테스트 코드를 짤때 실제 데이터 베이스에 저장된 게시글을 넣어주지 않아서 편한것 같습니다.혹시 실제 현업에서 코드를 짤때도 request 로 넘어온 데이터를 따로 검증을 하지 않아도 되는 건가요? @Transactional public CommentResponse create(CommentCreateRequest request) { Comment parent = findParent(request); Comment comment = commentRepository.save( Comment.create( snowflake.nextId(), request.getContent(), parent == null ? null : parent.getCommentId(), request.getArticleId(), request.getWriterId() ) ); return CommentResponse.from(comment); }
-
미해결실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)
정말 사소한 질문이지만 ... 궁금해서 물어봅니다.
안녕하세요... 정말 사소한 질문이지만...controller 를 만들때@GetMapping() 이런식으로 () 빈 괄호를 쓰시던데 혹시 특별한 이유가 있을까요 ???? 뭔가 가독성이 좋다거나...?? 이런 스타일은 첨봐서 신기해서 문의드립니다 !
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Category 엔티티 계층 질문드립니다.
@Entity @Getter @Setter public class Category { @Id @GeneratedValue @Column(name = "catagory_id") private Long id; private String name; @ManyToMany @JoinTable(name = "category_item",joinColumns = @JoinColumn(name = "category_id"),inverseJoinColumns = @JoinColumn(name = "item_id")) private List<Item> items = new ArrayList<>(); @ManyToOne @JoinColumn(name = "parent_id") private Category parent; @OneToMany(mappedBy = "parent") private List<Category> child = new ArrayList<>(); }이 부분에서, 카테고리의 계층? 을 표현하기위해 카테고리 엔티티를 위와 같이 하셨는데요. 여기에서@OneToMany(mappedBy = "parent") private List<Category> child = new ArrayList<>();이 부분이 무슨 의미로 사용되는지 이해가 잘 되지않습니다.. 연관관계의 주인이 아닌쪽이기 떄문에 mappedBy를 적어준거같은데, 해당 코드가 필요한 이유와 사용되는 목적이 무엇인지 질문드립니다. 그리고 private Category parent와 private List<Category> child = new ArrayList<>();가 어떤 연관관계가 있길래 연관관계를 맺는것인지 이해가 잘 되지않아서 질문드립니다. 감사합니다.