묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
설계관련 고민 질문 드립니다!
안녕하세요 강사님 강의 잘 듣고 있습니다 다름이 아니라 프로젝트 회의를 하던 와중에 다음과 같이 토론을 하게 되었는데 강사님 생각은 어떤지 궁금해 질문드립니다! 오늘 이야기를 하면서 장황하게 3~4시간 정도는 토론을 하였는데 내용은 다음과 같습니다. 1. 도메인 주도 설계 를 하는 것이 가장 옳은 길일까? => 페이지 별로 설계를 했을 때 너무나 불편한 점이 많았다. 페이지들 자체에서 공통적으로 필요한 컨트롤러들은 따로 빼서 공통으로 관리한다던지... 유지보수가 너무 어려웠던 것 같다. 아무래도 도메인 주도 설계가 맞다는 결론을 냈다. 2. 클라이언트와 서버의 DTO와 엔티티의 변환, 혹은 DTO와 DTO의 변환은 자주 이루어지는 것이 맞는 방법일까? 1번에서 도메인 주도 설계를 하는 것이 가장 유지 보수 및 코드 재사용성이 가장 뛰어날 것 같다는 결론을 내리고 나서 기존의 코드들을 보니 클라이언트 - 컨트롤러 통신에서 발생하는 DTO에 너무 의존하고 있다는 느낌을 가졌다. 예를 들자면) 기존 코드에서는 회원가입을 하는 api 가 있다고 가정을 하고 컨트롤러에서 요하는 DTO는 닉네임과 비밀번호를 받아드린다고 했을 때 Service계층에서 MemberService.save(RequestDTO) 형식으로 되어 있다 보니 컨트롤러 - 서비스 간의 통신이 1:1로 맞게 되는 (해당 컨트롤러에서만 이 save메서드를 사용하게 되는 문제점이 발생하게 되었다) 즉, 코드의 재사용률이 매우 떨어진다. 물론 여기서에서는 MemberService.save(Member)를 사용하면 되는 것 아니냐라는 결론이 도달하게 되었으나 프로젝트 로직중에 어떤 도메인을 저장해야하는데 도메인 저장시에 DTO에 주어진 값으로 연관되어있는 다른 도메인을 추가로 생성해야 할 때는 MemberService.save(Member)로 해결 할 수가 없고 서비스 계층으로 다른 도메인을 추가 할 수있게끔 추가적인 정보를 주어야 하는 상황에서는 도메인만 매개변수로 줄수가 없는데? => 그러면 컨트롤러에서 주는 DTO를 Service.save 매개변수에 직접 넣어야하는거야? => 그러면 또 1:1관계가 되어버리는데? ( 서비스가 컨트롤러에 너무 의존하게 되는데? ) 이런 식으로 꼬리에 꼬리를 물게 되었다. 약간 이런 고정관념을 깨게 된게 기존에는 DTO가 그냥 클라이언트 - 컨트롤러 단에서 데이터 중복을 막기 위해서 사용하는 것인 줄만 알았는데 Controller - Service간의 통신이나 어떤 계층 간의 통신 모두 DTO를 적용시키는 경우도 많다는 이야기를 듣고 다시 생각 해보게 되었다. => 그래서 내린 결론이 1:1 관계를 깨버리기 위해서는 request의 DTO를 Service에 전달할 것이 아니라 추가적으로 Controller, Service간의 DTO를 추가적으로 결정하여서 더이상 Service가 Controller 측의 DTO에 의존하지 않게 만들게 하면 어떻겠느냐의 결론이 들었다. => 그런데 이제 DTO를 남발하게 될 경우에 Controller 쪽에서는 결국 클라이언트 요청에 대한 DTO를 Service에게 요청을 보낼 DTO로의 변환이 많아지게 되며 코드를 쉽게 알기 어렵다는 추가적인 고민이 발생 했다. => 그러면 매개변수가 3개 이하로 필요한 메서드에 대해서는 DTO를 만들지 말자는 결론이 났고 매개변수의 종류로는 도메인과 Primitive, Wrapper 타입만을 정의하고 다른 계층 통신에 사용되는 DTO는 절대 넣지 않는 것으로 결론이 났다. 3. 생성자가 남발되는 것에 대한 고민 DTO 마다 도메인을 건들이게 될 경우 수많은 생성자들이 생기게 된다. 기존 프로젝트는 그래서 진짜 도메인에 많게는 생성자가 5~6개는 있었습니다 보면 볼 수록 이게 맞나 싶었지만 그 때는 설계나 디자인 패턴 같은 것에 대해 알려줄 사람도 없고 일단 굴러가기만 하면 된다는 입장이여서 이게 맞나 싶은 것들은 다 넘어갔지만... => 빌더 패턴이라는 것을 알게 되었는데 지금처럼 생성자가 5~6개정도 될 경우에 더욱 깔끔해진 코드를 볼 수 있게 된다. 특히나 현재로써는 롬복에 @Builder를 지원하니 사실상 표면적으로 드러나는 생성자가 없다고 생각해도 무방하다. 후에 빌더 패턴에 대해서 다룰 예정이다. 4. repository에서 조회시에 어쩔 수 없이 DTO를 반환하게 되는 경우 respository계층에서 fetch join으로 모든걸 해결 할 수는 없으니 DTO로 반환하는 이슈가 있다. repository에서는 가능한 도메인 객체로 반환을 해야하는 것이 옳다고는 생각하는데 이 경우는 특히나 대처하기가 어려운것 같다. => 분명히 이런 DTO로 반환의 경우에는 조회 로직이 대다수 일텐데 그럴 경우에는 그냥 Controller에서 repository를 바로 참조해도 되는 거 아닐까? Service 계층을 굳이 거쳐야 할까? => 아까도 비슷한 내용에 대한 토론이였는데 그러면 이번에는 응답과 관련이다. => 응답은 그런데 하위 계층을 의존해도 될 것 같다. 하위에서 받아온 응답데이터를 요청보다는 가공하기가 더 쉬우니까 말이다. => 그래서 Controller에서 repository로 바로 데이터를 주고 받아도 될까? 안될 껀 없지만 계층구조에 너무 어긋나는 것 아닐까 생각이 든다. 이부분은 결론을 짓지 못했다. 저희가 생각한 논리 흐름이 맞는지와 이에 생각하는 강사님 생각이 너무너무 궁금합니다 추가로 결국 내린 결론은 다음과 같은데 강사님 생각은 어떠하신가요??? 1. 도메인 주도 설계가 가장 controller - service - repository 계층 구조에 적합한 것 같다. 2. 하위 계층의 요청에 대한 DTO는 절대 상위 계층의 DTO를 의존해서는 안된다. 3. 프로잭트 규모가 커질수록, DB가 커질 수록 생성자의 갯수는 비약적으로 늘어나게 되는데, 빌더 패턴을 도입해서 생성자 갯수를 줄이자 요즘에는 lombok 라이브러리로 코드의 양을 더욱이 줄일 수 있다. 4. 상위계층 로의 응답은 하위계층에서의 응답에 대해 의존성을 가져도 된다.
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
강의에서 진행하는 pdf 교안은 따로 없나요??
강의를 듣고 있는데 사용되는 pdf 교안은 따로 없을까요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원 리포지토리 테스트케이스 작성 편에서 clearStore() 시 질문
테스트 순서가 보장되지 않으므로 clearStore()를 호출해준다고 하셨는데, sequence 필드에 대한 초기화도 필요할 거 같습니다. 호출 순서 바뀌면 findById()에 대한 테스트가 깨집니다.
-
미해결스프링 핵심 원리 - 기본편
모바일(코틀린) 앱을 제작하려하는데 스프링을 이용해서 rest api 서버를 만드려고 합니다.
모바일(코틀린) 앱을 제작하려하는데 스프링을 이용해서 rest api 서버를 만드려고 합니다. 시간이 촉박해서 최대한 적게 배우고 만들고 싶은데 그렇다면 어느정도까지 스프링을 알아야 할까요?
-
미해결웹 개발자와 정보보안 입문자가 꼭 알아야 할 웹 해킹 & 시큐어 코딩
질문입니다.
외부개체를 불러올때 불러오는파일이 자신pc에 있는파일을 불러오는게 맞을까요??
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
vue.js devtools질문드립니다
안녕하세요! 강의내용중에 mutation을 사진(강의)처럼확인하고싶은데 제가 설치한 확장프로그램은 state만뜹니다ㅜ 혹시 어떤 문제인지알수있을까요ㅜㅜ
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
파이썬 실전 모의고사 강의 업로드 일정
안녕하세요 실전 모의고사 파이썬용 업로드 애타게 기다리고 있습니다. 3월 안에 강좌가 열리게 될까요? 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
@Pool_Root에 질문이 있습니다.
강의 정말 잘 듣고 있습니다. 제가 질문드릴 것은 @Pool_Root에서 Unity_Chan이 pool 생성이 되야 하는데 생성이 되지 않습니다. 소스를 다운받아서 poolManager나 다른 소스들을 비교해가면서 봤는데.. 도통 뭐가 문제인지 잘 모르겠습니다. 혹시 무슨 문제인지 알려주시면 정말 감사합니다. 실행된 unity인데 보시는 바와 같이 생성이 안된채로 나옵니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
질문 X ,로그인되고 쿠키도 있는데 로그인하라고 에러발생할떄
프론트, 백엔드 서버 홈페이지 둘다 들어가셔서 개발자 도구 -> application -> cookie 삭제하고 다시 로그인해보세요
-
미해결[하루 10분|GA] Google Analytics(GA) 보고서 살펴보기
유익한 강의 잘 들었습니다
GA4에 대한 학습과 퍼널설계에 대한 학습도 듣고싶습니다~
-
미해결면접과 취업을 부르는 '퍼블리셔 개인 포트폴리오 홈페이지' 제작
라이트박스...아무리해도 안됩니다.
선생님 ㅜㅜ이 3가지 cdn넣고 말씀주신대로 data-alt="iframe" 해도 나오질 않습니다,,, 구글링해보니 어떤 사람은 iframe앞에 data-lightbox 이렇게 적으라던데 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.3/css/lightbox.min.css"> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.3/js/lightbox.min.js"></script> 그렇게 해보아도 전혀 안 나오네요 ㅜㅜ문제가 뭘까요
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
특정문자뒤집기
코드를 다음과 같이 작성 했는데 예외 케이스가 있는지 궁금합니다. import java.util.Scanner; public class 특정문자뒤집기 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); char[] arr = str.toCharArray(); boolean[] bln = new boolean[str.length()]; for(int i=0; i<arr.length; i++) { if((Character.isAlphabetic(arr[i])) &&!bln[i]) { char temp = arr[Math.abs(i-arr.length)-1]; bln[Math.abs(i-arr.length)-1] = true; arr[Math.abs(i-arr.length)-1] = arr[i]; arr[i] = temp; bln[i] = true; } } for(char ans : arr) System.out.print(ans); } }
-
미해결[리뉴얼] 처음하는 MongoDB(몽고DB) 와 NoSQL(빅데이터) 데이터베이스 부트캠프 [입문부터 활용까지] (업데이트)
주피터 노트북 코드셀 실행 오류
안녕하세요. :) 질문이 있는데요. 질문 전에 스택 오버 플로우와 네이버에서 해결해 보려고 하루종일 뭐가 문제인지 찾아봤는데 해결이 안돼서 질문드립니다. 주피터 노트북에서 코드셀을 처음에 실행했을 때는 결과물이 잘 나오는데 같은 셀을 한번 더 실행하면 코드가 실행됐다는 말만 나오고 결과물이 나오지 않습니다... 왜 이런건가요? 아래 이미지에서 볼 수 있듯이 코드셀을 처음 실행할 때는 결과물이 나오는데 같은 셀을 한번 더 run하면 아무것도 안나옵니다..
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드하는과정에서 문제가 발생합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용] 다른 질문글에 달린 답변인 https://blog.naver.com/PostView.naver?blogId=tofhadl529&logNo=222374497101&from=search&redirect=Log&widgetTypeCall=true&directAccess=false 이 사이트로 들어가 자바 버전등을 확인후 설정했는데 문제가 발생합니다. 해결방법이 있을까요? 혹시 참고가 될까싶어 현재 세팅 첨부합니다.
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
5:30 쯤에...
Ground Truth와 Selective Search 두개의 IOU를 구하는데 0.3 이하가 Background인건 알겠는데 0.3 이상인데 GT가 아닌 경우가 있나요?? 원래 IOU자체가 GT랑 SS두개로 확률을 구하는것이 아닌가요?? 그리고 Feature Map통과하고 Flatten적용후 Bounding Box Regression이 하나의 Layer로 붙는건가요?? 정확히 적용되는 위치가 궁금합니다!! 적용후 원래 S.S 2000개의 Box들이 dx(p), dy(p), dw(p), dh(p)가 학습해나가면서 IOU에 따라 걸러지고, 위치가 바뀌는건가요?? 아니면 역전파로 처음 S.S까지 가는건가요?? 항상 감사합니다 ^_^
-
미해결스프링 시큐리티
질문
선생님 강의를 보다 궁금한점이 생겼습니다. 제가 옛날에 들었던 얘기가 있었는데 강의소개에는 기업에서 form 방식을 많이 이용한다고 봤습니다. 그런데 이렇게 세션을 이용하는 방식은 세션 자체가 서버에 저장되는 방식이기 때문에 서버에 부담을 주게된다고 해서 jwt 를 많이 이용한다고 하는데 jwt 보다 좋은 점이 있을까요?
-
미해결객체 지향 프로그래밍 입문
캡슐화 질문
안녕하세요 강의 정말 흥미롭게 잘 보고 있습니다. 다름이 아니라 정답을 보기전 강의를 멈추고 제가 생각했던 캡슐화랑 비교해가면서 보고 있는데요 질문1 연습문제 1번에서 저는 두번째 if문만이 아닌 if 문 3개를 한꺼번에 메서드로 만들어서 캡슐화를 진행하려 했었는데 이렇게 해도 괜찮은가요?? 질문2 연습문제 3번 같은 경우에도 elapasedTime 메서드에 start() 와 stop() 메서들 넣어 아예 하나의 메서드로 캡슐화 시켜버리고 호출시 elapasedTime메서드만 호출하도록 캡슐화 하는 방법을 생각 했었는데 이방식도 괜찮은건가요??
-
미해결벡터 미적분학 시리즈1 - 미분 기초
벡터의 norm에 관해서
안녕하세요. 강의 잘 듣고 있습니다. 고등학교에서 기하와 벡터를 배울 때 벡터의 크기를 배운 적이 있습니다. norm과 정의가 같은 것 같은데, 고등학교 땐 |a|이고 대학수학의 norm은 왜 ||a|| 인가요?둘이 다른 건가요? 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
다음 강의 커리큘럼에 대해 궁금한게 있습니다
안녕하세요. [ 스프링 핵심원리 기본편 / 자바 ORM 표준 JPA 프로그래밍 기본편 / 스프링 입문 ] 이 세 강의를 들은 후 SpringBoot - JPA(Mysql ) 을 활용한 프로젝트를 진행해보고 있습니다. 그런데 [ SpringBoot - JPA(Mysql ) 의 설정 ( application.properties )] , [ 엔티티와 빈 컨테이너 구현 ] 관련해서 어려운게 있어서 추가적으로 강의를 하나 더 듣고 싶은데 1. 모든 개발자를 위한 HTTP 기본 상식 2. 실전! 스프링 부트와 활용 1 3. 실전! 스프링 부트와 활용 2 4. 실전! 스프링데이터 JPA 이 네 가지 강의 중 지금 제가 듣기 적합한게 있을까요? 물론 다 들을 거긴한대 프로젝트와 연관해서 수업을 듣고 싶어 질문남깁니다. 감사합니다.
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
10 자릿수의 합
#include <iostream> #include <vector> #include <algorithm> using namespace std; int digit_sum(int x){ int temp; int sum = 0; while(x==0){ temp = x%10; sum = sum + temp; x = x/10; } return sum; } int main() { int N; vector<int> v; vector<int> v2; cin >> N; int number; for(int i=0; i<N; i++){ cin >> number; v.push_back(number); } for(int i=0; i<N; i++){ v2[i] = digit_sum(v[i]); cout << v2[i] <<endl; } return 0; } 안녕하세요 강사님. 저는 10번 문제 같은 경우 두개의 벡터를 이용해서 문제를 해결하려고 해봤는데요. 위의 코드를 실행하면 vector subscript out of range 라는 에러 메세지가 떠서요... 혹시 어떤 점이 문제인지 알려 주실 수 있을까요?또, 저는 주로 vector를 이용해서 문제의 해결법을 많이 생각하는 편인데요. 이렇게 vector를 사용해서 문제를 풀면 안 좋은 점이 있을까요??