묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
토비선생님, 사소한 질문이 하나 있습니다.
맹목적인 파라미터의 숫자가 아닌 보통 함축적 정보를 전달하기 위해 DTO, 즉 파라미터 오브젝트를 사용해서 전달하는 방식은 워낙 간결한 방식이라 저도 선호도가 높긴 합니다. 하지만 엔티티의 영역에서 DTO와 유사한 레코드 형식의 매개변수를 전달 받는 방식은 어느 정도 엔티티의 순수성이 침해 받는 방식이 아닌가 생각이 들어서요.실제로 작성하신 코드를 봤을 때 그런 순수성 집착 보다 휴먼 에러를 사전에 방지하는 접근 방식이라 매우 적절한 트레이드 오프라고 생각이 들기도 합니다. 이 부분에 대해서 개인적인 궁금증이 생겨서 질의 드립니다. 아직 강의를 다 본 상황이 아니라서 이런 질문을 하는 게 맞는지 작성하는 지금 이 순간 조차 고민이 되지만, 실제로 제가 생각하던 방식과의 거리감이 느껴져서 질문을 남겨봅니다.
-
해결됨토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
프로필 주소(profile_address) 제거 시 Unique 위반에 관한 질문
안녕하세요 토비님! 항상 강의를 통해 새로운 시야를 얻는 것 같아 감사하게 듣고 있습니다!강의를 수강하던 중 궁금한 점이 하나 생겨 질문 드립니다.우선 현재 Section7, 39강까지 수강한 상태입니다. 도메인 규칙 상으로 프로필 주소가 제거 가능하다고 정해졌고, 이는 코드로 상세히 표현되었다고 생각했습니다.하지만 "프로필 주소는 제거할 수 있다"라는 규칙을 적용해 memberA가 프로필 주소를 빈 문자열 형태로 변경한다면, memberB의 경우 동일하게 빈 문자열을 저장할 수 없으니 프로필 주소를 제거할 수 없는 것 아닌가라는 생각이 들었습니다.그래서 기존 Github에 공개된 코드 테스트에서 실험을 진행했습니다. (제 코드는 차이가 있을 수 있어서 공개된 자료를 이용했습니다.) MemberRegisterTest#updateInfoFail 에 아래와 같이 테스트를 추가해 보니entitymanager.flush() 부분에서 Unique index or primary key violation 이 발생했습니다. 제 생각에는 도메인 규칙을 변경하거나, profile_address의 값이 빈 문자열일 경우 NULL을 저장하도록 로직을 변경해야한다고 생각합니다.혹시 제가 놓친 부분이 있는지, 토비님의 의견은 어떠신지 궁금합니다. 항상 감사하게 수강하고 있습니다!
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
계층형 아키텍처와 헥사고날 아키텍처는 정말 본질적으로 많이 다른 것일까?
최근에 제가 고민했던 부분의 토비님의 의견이 궁금해서 질문드립니다. “계층형 아키텍처와 헥사고날 아키텍처는 정말 본질적으로 다른 걸까?” 예를 들어, 계층형 아키텍처에서도 인터페이스를 통해 상위 계층이 하위 계층을 의존하도록 설계하면 DIP(Dependency Inversion Principle)를 지킬 수 있습니다. 그렇게 하면 헥사고날 아키텍처가 지향하는 의존성 역전과 사실상 동일한 구조가 만들어지지 않을까요? 그렇다면 DIP를 잘 구현한 계층형 아키텍처는 헥사고날 아키텍처와 다르지 않다고도 볼 수 있을 것 같습니다. 이 생각대로라면, 우리가 그동안 “계층형 아키텍처”라고 부르며 개발하던 많은 구조들이 사실상 헥사고날 아키텍처였던 것 아닌가? 라는 생각도 들었습니다. 만약 두 아키텍처가 여전히 다르다고 본다면, 그 차이는 폴더 구조나 패키지 구성 방식처럼 물리적인 형태에서 오는 걸까요? 하지만 두 아키텍처 모두 논리적이고 추상적인 설계 철학을 이야기하는 것인데, 물리적 구조로만 구분하는 건 이상하다고 느껴집니다. 결국 저는, 잘 설계된 아키텍처라면 헥사고날이든 계층형이든 최종 목표는 동일하다, 라는 생각이 들었습니다.즉, SRP(Single Responsibility Principle) 를 지키고, 외부 기술의 변화가 도메인에 영향을 주지 않아야 하며 (헥사고날),persistence 계층이 바뀌더라도 핵심 비즈니스 로직은 변하지 않아야 한다 (계층형),는 점에서 둘의 지향점은 같다고 느낍니다. 혹시 제가 놓치고 있는 중요한 관점이 있을까요?토비님께서는 이 두 아키텍처를 어떻게 구분하시고, 어떤 기준을 중요하게 보시는지 궁금합니다.
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
controller 의 port 패키지의 service 인터페이스 사용
controller 패키지가 service 패키지에 의존해야하는데 interface를 controller의 port에 둠으로써 service가 controller에 의존하게 된다고 말씀하시고 수정한다고 했는데 수정이 없네요. service 인터페이스들을 service.port 패키지로 옮겨주면 될거 같습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
given when then
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Test @DisplayName("상품주문_재고수량초과") public void orderOverStock() throws Exception { //given Member member = createMember(); Item item = createBook("시골 JPA", 10000, 10); int orderCount = 11; //when //then Assertions.assertThrows(NotEnoughStockException.class, () -> orderService.order(member.getId(), item.getId(), orderCount)); }촬영 시점과 달리 assertThrows로 변경되며 given, when, then이 참 모호해진 것 같습니다. 제가 이해한 바에 따르면, 변수 설정은 given, 메서드 호출은 when, 결과와 검증은 then에서 수행하는 것 같은데위 코드와 같은 경우는 어떻게 분리해야 할까요?when은 위와같이 비워두는게 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
생성자 대신 세터를 쓰는 이유
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]14:26을 보시면, createOrderItem에서 모든 필드에 대해 세터를 호출하여 일일히 값을 주입합니다.다양한 파라미터를 사용하는 경우의 수에 대해 각각 생성자를 선언해두면가독성이 상승하여 추후 유지보수에도 더 편리할것 같은데, 이렇게 사용하는 이유가 있나요?스프링 강의만 수강하고 야생형 코스를 막 시작한 입장에서, 제가 기억하는 생성자 관련 원칙은 다음과 같습니다.아무 생성자도 없다면 기본 생성자가 생성된다.JPA는 리플렉션을 통해 코드를 생성하기에 기본 생성자는 반드시 필요하므로, 필요하면 명시하여 생성한다.DI를 위해서 @RequiredArgsConstructor를 이용하여 final 필드를 사용하는 생성자를 생성하고, 주입받는 방식을 권장한다.생성자는 최소화하라는 다른 원칙이 존재하는 것인가요?
-
미해결Spring Boot와 React로 배우는 초간단 REST API 게시판 만들기
리액트 부분 vscode 써도 괜찮을까요
강의에서 리액트 부분도 인텔리제이로 사용하시는데얼티메이드 버전이 아니다보니 하나하나 타이핑을 해야하고 오류가 어디부분인지 알려주질 않아서 vscode로 리액트 부분해도 상관없을까요
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
어떤 것이 업데이트 된 건가요?
강의를 한 번 수강했던 수강생입니다.반년전 듣고 실습을 안해서 까먹어서 다시 들어볼려고 하는데 어떤 게 업데이트 된 건지 알 수 있을까요? 기존에 커리큘럼별 강의 제목은 같은데 업데이트 된 건가요? 아니면 새로 찍으신 강의가 별도로 올라와있는건가요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
멀티 모듈 구성
안녕하세요 토비님,우선 강의를 통해 제가 알고 있던 헥사고날과 DDD(도메인 주도 설계)에 대해 다시 한번 깊이 생각해볼 수 있는 소중한 경험이 되었습니다. 좋은 강의 만들어주셔서 정말 감사합니다.토비님께서 생각하시는 헥사고날에, DDD 과 멀티 모듈의 바람직한 설계에 대해 궁금해서 질문을 남기게 되었습니다. 여기서의 멀티 모듈은 우선 MSA 를 제외하고 순수 멀티 모듈을 통해 시스템을 설계를 한다는 것을 전제하고 있습니다.가장 흔하게 보이는 멀티 모듈 구성의 패턴은 Storage (JPA), External (외부 Dependency), N 개의 서비스에 해당하는 Web Server 모듈 & 기타 등이 있는 것 같은데요. 멀티 모듈을 현 강의에서 보여주고 말씀해주시는 헥사고날과 DDD 와 결합했을 때, 어떻게 구성하면 좋을지 많은 생각이 들고 또한 현업에서 비슷한 고민을 하고 있어서 토비님의 생각이 궁금해 질문을 남기게 되었습니다.감사합니다.
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
개인적인 호기심 질문인데요
도메인에 "속성과 행위가 모두 포함"되어야하는데 그러면 만약에 "행위" 자체가 "외부 의존"을 가져야만 하는 경우에는 이런 것은 어떻게 만드는 것이 좋을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
모듈 facets jpa추가
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]17:13경 하신 설정이최신 intellij와 스프링부트에서도 필요한 설정인가요?어떤 기능을 하는 설정인지 궁금합니다.2025년 기준 인텔리제이에서 확인할 수 없어 여쭙습니다.
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
@TestConfiguration 관련 설명과 실제 동작이 다른 부분이 있는 것 같습니다.
안녕하세요 토비님! 좋은 강의 정말 감사드립니다.@TestConfiguration 에 대한 설명을 해주신 부분 중에서 테스트 결과와 다른 부분이 있는 것 같아 확인차 질문 드립니다. <28. 회원 애플리케이션 서비스 테스트 (2)> 의 11:38에서 "@TestConfiguration 에 어떤 Bean을 정의하면 이게 우선이 되어 돌아갑니다." 라는 말씀을 해주셨는데요.해당 말씀이 맞는지 테스트해 보기 위해, 현재의 강의 예제 코드에서 @TestConfiguration 이 붙은 클래스의 PasswordEncoder를 정의한 Bean 메서드의 이름을 testPasswordEncoder로 변경하고 테스트를 돌려 보니 아래와 같은 오류가 발생하였습니다.(EmailSender의 경우 DummyEmailSender에 @FallBack 이 붙어 있어서 @TestConfiguration 의 EmailSender Bean 메서드의 이름을 다르게 구성하더라도 테스트는 정상적으로 동작합니다.) @TestConfiguration 이 정의되었다고 해서 우선순위로 동작하지는 않는 것으로 보이고,기존 Bean의 적용 우선순위에 따라 @TestConfiguration 에서 정의한 메서드 이름과, 이를 사용하는 곳의 필드 이름이 동일한 경우 해당 Bean을 찾아서 동작하는 것으로 보였습니다. 혹시 제가 잘못 이해하고 있거나 보완이 필요한 부분이 있다면 편히 말씀 부탁드립니다. 확인 부탁드립니다.감사합니다 :)
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
spring_cloud_gateway_requests_seconds_count를 Execute시 다른 요청을 하지 않았음에도 오류 요청의 숫자가 계속 증가합니다.
spring_cloud_gateway_requests_seconds_count{httpMethod="GET", httpStatusCode="401", instance="localhost:8000", job="apigateway-service", outcome="CLIENT_ERROR", routeId="user-service", routeUri="lb://USER-SERVICE", status="UNAUTHORIZED"}22spring_cloud_gateway_requests_seconds_count{httpMethod="GET", httpStatusCode="404", instance="localhost:8000", job="apigateway-service", outcome="CLIENT_ERROR", routeId="order-service", routeUri="lb://ORDER-SERVICE", status="NOT_FOUND"}회원가입과 로그인만 하더라도 이러한 것들의 숫자가 올라가 총 요청 수 중 성공한 숫자가 매우 적습니다. chat gpt에서는 자동으로 health-check를 해서 그렇다라고는 하는데 정확히 어떤 것이 문제인지 잘 모르겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
distinct 질문입니다.
23:20분에서 distinct를 사용하면 같은 식별자를 가진 엔티티를 제거한다고 하시는데여기서 같은 식별자에서 식별자가 어떤걸 말하는건가요?id(pk)인가요? 그런데 id(pk)가 같을 수는 없을 것 같은데..
-
미해결Spring Boot와 React로 배우는 초간단 REST API 게시판 만들기
선생님 덧글의 답글
혹시나 못보실까 싶어서 글로 남겨요 여기 답변입니다. 환경변수 설정잘되있고 ide 상에서 java -version 쳤을때 잘나옵니다 ㅠㅠstart.spring.io 여기서 만들떄도 21 버전으로 선택했구요혹시나 문제 있나싶어서 ide도 다시 지웠다 깔고, jdk도 다시 지웠다 깔고 , start.spring.io 도 다시 새로 하고 해도 안되네요 ㅠㅠ Execution failed for task ':restapi.prac.PracApplication.main()'.> Process 'command 'C:\Program Files\Java\jdk-21\bin\java.exe'' finished with non-zero exit value 1* 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.> Get more help at https://help.gradle.org.BUILD FAILED in 9s3 actionable tasks: 1 executed, 2 up-to-date 이 에러메시지가 도대체 뭔질 모르곘네요,,, gpt한테 물어봐도 알수없는 말만하고... 만들어보고싶은데 시작도 못하고 있으니 너무 답답하네요.... gpt 계속 괴롭혀도 이상한말만해요
-
미해결Spring Boot와 React로 배우는 초간단 REST API 게시판 만들기
(재업) 선생님 제발 도와주세요
일단 여기서 이렇게 뜨구요 이거 전에Spring Initializr여기서 설정하고 그거 열어줘서 작업하는건데 저렇게 뜨는데 어떻게해야하나요...혹시나 PracApplication.java 에서 실행하면 Execution failed for task ':restapi.prac.PracApplication.main()'.> Process 'command 'C:\Program Files\Java\jdk-21\bin\java.exe'' finished with non-zero exit value 1* 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.> Get more help at https://help.gradle.org.BUILD FAILED in 12s3 actionable tasks: 1 executed, 2 up-to-date 이렇게 또 에러가 뜨구요...추가로 ai답변으로 build.gradle 의 dependencies 확인하래서 이거 확인했는데 이상없는거 같고 정상적으로 C:\Program Files\Java\jdk-21\bin\java.exe 이 경로에 있습니다. 마지막으로 이렇게 build.gradle을 연 상태로 run을 하면되는데 (localhost:8080 은 안열림)application.properties 에서는 run 버튼 자체가 활성화가 안되있고 PracApplication.java 에서는 run이 활성화는 되있지만 계속 제가 말헀던 에러가 뜹니다제발 ai답변말고 선생님이 답변해주시면 감사하겠습니다
-
미해결Spring Boot와 React로 배우는 초간단 REST API 게시판 만들기
앞에 내용 다 따라했는데 실행이안됩니다 자꾸
일단 여기서 이렇게 뜨구요 이거 전에Spring Initializr여기서 설정하고 그거 열어줘서 작업하는건데 저렇게 뜨는데 어떻게해야하나요...혹시나 PracApplication.java 에서 실행하면 Execution failed for task ':restapi.prac.PracApplication.main()'.> Process 'command 'C:\Program Files\Java\jdk-21\bin\java.exe'' finished with non-zero exit value 1* 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.> Get more help at https://help.gradle.org.BUILD FAILED in 12s3 actionable tasks: 1 executed, 2 up-to-date 이렇게 또 에러가 뜨구요...
-
미해결Spring Boot와 React로 배우는 초간단 REST API 게시판 만들기
실행시 에러
실행시 이런 에러가 뜹니다..
-
미해결Spring Boot와 React로 배우는 초간단 REST API 게시판 만들기
최초에 서버 키는게 안됩니다 ㅠㅠ
스프링 오토컨피규어 이거 치는것도 회색글자로 저렇게 나오고 위에 spring boot 구성 파일은 얼티메이트에서 지원됩니다 이런것도 뜨고... 실행버튼도 안됩니다 ㅠㅠ
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
react 소스 부탁드립니다!
강의 너무 잘 보고 있습니다.덕분에 처음 서버 개발할 때 큰 도움 되었습니다. 좋은 강의 감사합니다! 메일 : kei02012@naver.com