묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결생성형 AI를 활용한 세상에서 제일 쉬운 파이썬 개발 클래스
VS code 사용법 문의
좋은 강의 감사합니다. [onc88]강의 내용 중 삼각형 아이콘을 눌러 실행 화면 만들 때 아래 같이 구성 안되고 아래 : C:\Inflearn\source_stage\01_start_python_ai> python test.py & C:/Python111/python.exe..... 아래2 같이 나와서 삼각형 아이콘을 눌러도 동작 안됩니다. (python test.py 실행해야 동작) 아래2:C:\Inflearn\source_stage\01_start_python_ai 다음 & C:/Python111/python.exe.....을 추가하려면 어떻게 해야하나요?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
DIP 개념에 대한 질문입니다.
DIP라는 개념을 상위수준의 모듈에서 하위수준을 의존해서는 안된다는 정의에 대한 설명에서 질문드립니다. 이때 의존성의 순방향이란, 자바로 따지면 상위 객체에서 하위 객체를 생성하여 활용하는 정도로 이해했습니다. 이떄 저수준의 모듈이 변경된다는게 메소드 단위의 개념인지 객체의 구현체 단위의 개념인지 정확히 모르겠습니다. 메소드라면, 저수준의 모듈이 변경된다는게 사실 메소드 시그니처가 변경되면 문제가 되겠습니다만, 안에 구현이 바뀐다고 해서 상위 모듈에서 하위 모듈의 메소드를 호출할 때 영향이 간다는 생각이 들지 않았습니다.구현체라면, 런타임 시점에 구현체가 결정되고/ 실행되기 때문에 이를 담는 추상 객체로 코딩된 고수준의 모듈에는 변화가 없다고보면 되는건지요..? 결국 주입되는 구현체의 변경에 유연하다는 정도로 보면될까요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
초기 어플리케이션 구동 시 compose.yml 파싱 오류
spring-boot 버전 4.0.0 으로 프로젝트를 생성하면 어플리케이션 구동 시 아래와 같은 오류가 발생합니다. (현재 2025-12-08)3.x 버전으로 내리면 발생하지 않으니 참고해주세요.2025-12-08T18:40:05.881+09:00 INFO 2496 --- [splearn] [ main] .s.b.d.c.l.DockerComposeLifecycleManager : Using Docker Compose file /Users/coffeenjava/work/study/splearn/compose.yaml2025-12-08T18:40:06.285+09:00 ERROR 2496 --- [splearn] [ main] o.s.boot.SpringApplication : Application run failedtools.jackson.core.exc.StreamReadException: Unexpected character ('\' (code 92)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')at [Source: REDACTED StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION disabled); byte offset: #UNKNOWN]at tools.jackson.core.JsonParser._constructReadException(JsonParser.java:1800) ~[jackson-core-3.0.2.jar:3.0.2]
-
미해결만들면서 배우는 리액트: 컴포넌트 설계와 리팩토링
로컬스토리지 에러
3(index):1 Uncaught (in promise) Error: Access to storage is not allowed from this context. 이렇게 뜨는데요.또 로컬 스토리지 보면들어가긴 하거든요? 왜그럴까요
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
애플리케이션의 JPA 리턴과 도메인 모델
안녕하세요 토비님 강의 잘 수강하고 있습니다. 좋은 강의 감사드립니다. 저는 JPA엔티티를 도메인 모델로 사용하고 애플리케이션에서 이를 리턴하고 있습니다.그런데 새로운 팀원 한명이 이렇게 이야기하더군요이전에 마이바티스를 사용하다가 JPA가 나온거처럼 이를 대체하려면 코드변화가 필요할 것 입니다 사실 이것도 저는 맞는 말이라고 생각합니다. JPA 엔티티를 참조하는 모든 부분을 수정이 필요할 것 같습니다. 그럼에도 불구하고, 트레이드오프 관점에서 보면 현재 잘 사용하는 JPA엔티티를 그대로 사용하는게 더 효과적이라고 생각합니다. 여기서 궁금한게, 이렇게 새로운 데이터접근 기술이 나오게 되는 것까지 고려하는게 맞을까요? 어떠한 논리를 펼쳐서 JPA를 그대로 의존하는게 좋다고 이야기하는게 더 설득력이 있을까요?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
만약 보드를 이용한 게임의 종류가 더 다양해진다면 어떻게 될 수 있을지에 대한 고민
안녕하세요, 열심히 강의를 수강 중인 4년차 백엔드 개발자입니다.먼저 이렇게 퀄리티 높은 강의를 제공해주셔서 감사드립니다!저는 4년차임에도 아직 리팩토링할 때 '관심사의 분리' , '같은 관심사끼리의 응집'에 대한 느낌을 체득하지 못해서 듣고 있습니다.문득 SRP까지 강의를 들은 시점에 GameBoard를 보고 'GameBoard가 셀로 나눠진 보드판'을 의미하는 것이라면 현재 GameBoard는 '지뢰찾기'에 한정된 느낌인데, 나중에 체스, 오목, 장기와 같은 보드형 게임을 추가한다면 어떻게 바꿔야 할까를 고민해보게 되었습니다.질문을 올리는 이 시점에는 GameBoard를 더 포괄적인 개념의 보드판으로 두고 상속을 하는 구조로 바꾸고, open()이나 isLandMineCell()과 같이 '지뢰찾기'에 의존적인 역할은 "MineSweeperGameBoard 같은 자식에서 구현해야 하나?" 하는 생각이 들게 되어서요!좀 두서없는 질문이고 엉뚱할 수 있지만 공유자님이라면 게임의 종류가 다양해진다면 어떤 고민을 시작으로 변경해 나가시는지, 어떤 부분을 먼저 생각해보는 것이 좋을지 궁금합니다.(사고의 흐름..?) 좋은 강의 감사드리며, 앞으로도 더 좋은 강의 부탁드리겠습니다!감사합니다 😃
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
DIP 설명 후반부에 IOC에 대한 질문 드립니다.
안녕하세요.스프링 프레임웍에서 IOC 개념을 설명 해주시면서 항상 들었던 궁금한 점을 질문드립니다.IOC는 개발자가 짠 프로그램이 아닌, 프레임워크에 의해 객체가 관리(생성, 소멸)되는 것이라고 설명 주셨습니다. 저도 스프링 컨테이너의 BEAN를 인스턴스로 활용하는 것으로 대략 알고 있는데요. 그렇다면 IOC에 의해 주입되는 BEAN은 하나의 형태의 구현체 일텐데,, 스프링은 앞서 DIP에서 설명 주신 추상화된 인터페이스가 하나의 고정된 구현체만 BEAN으로 만들어 생성하는 걸까요?스프링 IOC의 장점을 설명하라고 하면 제어의 역전이 되면서 구현 인스턴스 변경에 유연해진다라고 들었는데,, 하나의 인스턴스로만 고정된다면 그것이 유연한 것일까 항상 궁금했습니다. 아니면 주입될 객체만 바꿔끼면 되니 유연하다는 표현을 하는걸까요?질문을 해보니 약간 스프링의 질문인데.. 항상 이해가 잘 되게 설명을 해주셔서.. 실례를 무릅쓰고 여쭈어봅니다. ㅠㅠ
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
안녕하세요 ! 혹시 자바가 아닌 다른 객체지향 언어를 알고있어도 강의를 들어도 괜찮을까요 ?!
안녕하세요 ! 혹시 자바가 아닌 다른 객체지향 언어를 알고있어도 강의를 들어도 괜찮을까요 ?! ps. 사실 결제는 이미했습니다..!
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
애그리거트 루트의 하위 도메인들의 depth가 깊어질 때 문의
안녕하세요 . 강의에서 애그리거트 루트가 하위 도메인을 일관성을 유지하기 위해member.updateInfo() 로 MemberDetail updateinfo() 를 호출하는것을 보았는데요 만약 Profille에 여러 속성(프로필주소, 프로필이미지를 불러올 수 있는 주소,정보 등이 존재)이 있어 값 타입이 아닌 Entity로 존재해야 할 경우엔 member.updateInfo() -> memberDetail.updateInfo() -> profile.updateInfo() 로 depth가 내려갈 것 같은데요. 뭔가 잘못된 방법 같아서요..혹시 이런 경우에는 어떻게 도메인을 설계해야 좋을지 궁금합니다...!!
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
companion object
안녕하세요 강사님 그 정적 팩토리 매서드는 강의에서 data class dto 측에 써 주셨는데 현업에서는 주로 dto에 쓰는 게 컨벤션인 가요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Custom 레프직토리 형식
안녕하세요 강사님 취준생으로써 강의 들으면서 궁금한 점 질문 드립니다.1.CustomRepository형식 과 Impl 형식이 보통 어떨때 자주 쓰이는 지 궁금해서 질문 드립니다. 2.JPA 에서 작성한 것들을 Querydsl 로 바꿀때가 그럼 ByXxx 에서 조인조건이 두개이상 들어가면 무조건 Querydsl 자바코드로 바꾸어 주는 게 좋을까요?
-
해결됨토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
페이징 처리를 해야한다면 어떻게 해야할까요?
Pageable 인터페이스와 @PageableDefault 를 컨트롤러부터 사용하면 편하게 작업할 수 있을 것이라고 생각하고 있습니다.그런데 spring-data에서 제공하는 것들이라 컨트롤러나 애플리케이션(서비스)에서 사용하면 안 될 것 같아서 새롭게 객체를 정의해서 사용해야 하는 것인가라는 생각이 드는데요. 한편으로는 유틸느낌으로 사용해도 되지 않을까라는 생각이 들기도 합니다. 실제로 @PageableDefault 이것은 org.springframework.data.web 패키지에 들어있어서 web계층을 대상으로 만들어진 것 같구요어떤식으로 풀어나가야 할까요? 추가적으로 Http interface를 사용하기 위해 @HttpExchange을 사용할 경우 required패키지 인터페이스에 바로 붙여서 사용해도 무방한걸까요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
애그리거트의 repository
안녕하세요 토비님! 애그리거트를 사용할 때 질문 사항이 있습니다.예) A도메인 B도메인이 있다 A는 애그리거트 루트이고 B는 A의 부속 엔티티이다.A와 B는 일대다, 다대일의 양방향 의존성을 가진다.B는 A를 통해서만 조작될 수 있다.이 때 B를 생성하거나 업데이트 할 때 B의 repository는 어디에 존재해야 하는가?@Entity public class A { @OneToMany(mappedBy = "media", cascade = CascadeType.ALL, orphanRemoval = true) private List<B> bs = new ArrayList<>(); public void updateNumber(long n){ this.bs.stream().forEach(b -> b.update(n); } } @Entity public class B { @ManyToOne(fetch = FetchType.LAZY) private A a; private long number; public void update(long n){ this.number = n; } } 이렇게 되어 있다고 할 때 변경 가능성을 생각할 때(물론 엔티티에서 이미 jpa에 기술을 사용하고 있긴하지만) B의 repository를 따로 가지는게 맞나요? 만약 따로 가진다면 B의 repository가 A repository에서 의존하여 처리 되어야 하나요?jpa에 완전 종속적으로 사용하면 B가 따로 repository를 가질 필요 없는데 순수함을 유지하지 하려 하니 이 부분에서 고민이 되네요. 아니면 이런 고민 자체가 잘못된걸까요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
Domain Expert가 정확히 어떤 역할을 하는 사람인가요?
도메인 모델을 만들기 위해서는 Domain Expert에게서 듣고 배워야 한다고 말씀하셨는데, 이들의 정확한 역할이 잘 이해가 가지 않습니다.온라인 서점을 예로 들자면 제 머리속에 상상되는 Domain Expert는 실제 서점을 운영하는 사장님이 떠오르는데 강의에서는 회사에서 해당 일을 오랫동안 해 오신 분이나, 관련된 시스템을 개발해 본 경험이 있는 시니어 개발자 같은 사람을 Domain Expert라고 말씀 주셨습니다.그렇다는건 Domain Expert 라는 역할은 이 회사가 개발하고 있는 서비스를 가장 잘 알고 있는 사람 (그것이 개발자가 되었든, 디자이너, po와 같은 비 개발자가 되었든)이라고 이해해도 되는 것일까요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
회원 애플리케이션 서비스 테스트 (1)
회원 애플리케이션 서비스 테스트 (1) 12:46초 부분EmailSenderMock에 getter 어노테이션이나 메서드가 없는데 어떻게 getTos를 사용하신 걸까요..?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
안녕하세요 메서드명 때문에 고민이 있어서 질문드립니다.
안녕하세요 강사님제가 create 메서드 명에 대해서 고민중인데private void createTip(RequestTipDto requestTipDto, User user) { Tip tip = Tip.builder().title(requestTipDto.getTitle()).content(requestTipDto.getContent()).user(user).build(); tipRepository.save(tip); } private Tip createTip(RequestTipDto requestTipDto, User user) { Tip tip = Tip.builder().title(requestTipDto.getTitle()).content(requestTipDto.getContent()).user(user).build(); return tip; } tipRepository.save(tip); 첫번째 코드는 create메서드 안에 tip을 빌더로 생성하고 save까지 같이 하는 코드입니다.두번째 코드는 tip을 빌더로 생성 후 리턴하고 해당 createTip을 호출한 메서드에서 save를 하는 코드입니다. 첫번째 코드는 둘이 같이 할 수있다는 장점이 있고, createTip하고 save를 또 따로 할 필요가 없는 장점이 있고두번째 코드는 나중에 재상용성이나, create메서드안에서는 create만 하는 SRP(단일책임원칙)을 하고 있다는 것이 장점입니다. 위 두가지 방법중 어느것이 더 좋은 방법일까요?그리고 위처럼 builder를 사용하는 코드는 길기 때문에 이를 service 클래스에서 따로 빼서 하는게 좋은지 아니면 entity 클래스에서 하는게 좋은지 궁금합니다. 강의 잘 보고 있습니다.
-
해결됨토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
정적 팩토리 메서드 관련 질문드립니다!
안녕하세요 토비님 궁금한점이 생겨 질문을 남깁니다.예제를 진행하실때 정적팩토리 메서드를 통해 객체를 반환할때생성자를 통하지않고 바로 멤버변수에 값을 넣어 반환하는걸 사용하셨는데 public static Member register(MemberRegisterRequest createRequest, PasswordEncoder passwordEncoder) { Member member = new Member(); member.email = new Email(createRequest.email()); member.nickname = requireNonNull(createRequest.nickname()); member.passwordHash = requireNonNull(passwordEncoder.encode(createRequest.password())); member.status = MemberStatus.PENDING; member.detail = MemberDetail.create(); return member; }이게 가능한 원리는 이해를 했습니다만 AI와 이야기하다보니 아래와 같은 이유를 제시하면서 생성자를 통한 반환을 강력 추천하더라구요부분 초기화 위험: 생성 직후 한동안 불완전 상태일 수 있어요. (중간에 예외가 나면 더더욱)final 을 못 씀: 생성자 밖 대입이 필요하니 final로 못 고정합니다(불변성/스레드 가시성 이점 상실).검증 누락 가능성: 검증/정규화가 흩어지기 쉬움 → 생성자 경로에 모으는 게 안전. 토비님 생각은 어떠하신지 궁금합니다.
-
해결됨토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
required 포트에 관해서
안녕하세요 토비님현재 파트1에서는 아직 required 포트에있는 repository 인터페이스를 다른 도메인에서 사용하고 있지 않아서 중복이 발생하고 있지 않지만, 만약 다른 도메인에서도 같은 리포지토리를 사용해야할 경우 어떻게 하면 좋을지 질문드립니다. 제가 생각한건 첨부한 이미지와 같습니다. 도메인별로 각각 required 포트에 MemberFinder 인터페이스를 선언하고 그것을 Adapter layer에서 각각 도메인 별로 구현합니다. 하지만 실제 로직은 Adapter레이어에 있는 MemberRepository를 부르는 역할만 할 뿐입니다
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
혹시 다음 편은 언제쯤 오픈할까요?
안녕하세요 토비님. 강의 잘 수강하고 있습니다.아직 강의 초반부만 들었지만, 아주 감명깊게 수강중입니다.혹시 다음강의 오픈은 언제쯤 예상하고 계실까요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
서비스 단위 테스트 코드 작성
MemberFinder 와 같은 유즈케이스 단위로 통합 테스트를 분리 해서 작성하셨는데 단위 테스트의 경우에는 분리를 어떻게 하시나요? MemberService (Query, Modify) 가 없이는 코드가 작성이 되질 않아서 질문 드립니다.