묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
- 
      
        
    해결됨Practical Testing: 실용적인 테스트 가이드
'외부 계층으로 분리한다'는 말이 궁금합니다.
강의에서 LocalDateTime.now()를 파라미터로 받게끔 해서 분리하는 걸 예시로 들어주셨는데요.'테스트하기 어려운 영역을 외부 계층으로 분리한다'는 말씀이 위 예시처럼 파라미터로 받게끔한다는 것인가요?외부 계층이라는 말이 잘 이해되지 않아서 질문드립니다! 테스트하기 어려운 메서드를 호출하는 상위 레벨의 메서드를 외부 계층이라고 하는 것일까요?
 - 
      
        
    미해결Practical Testing: 실용적인 테스트 가이드
DTO 분리에 관련된 질문이 있습니다.
안녕하세요. 강의 잘 듣고 있습니다.만약에 Service를 Write / Read 로 나눠서 관리를 한다고 하면Service 패키지쪽의 DTO도 나눠서 생성을 하시나요?아니면 그 부분은 같이 사용하시는 편인가요?
 - 
      
        
    해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
사용자로 하여금 어떻게 JWT를 헤더에 포함하게 하나요?
jwt 부분을 다 듣고 아래 테스트 수업 듣는 중입니다.사용자 로그인 시에 우리가 jwt를 발급하고,사용자가 매 요청마다 이걸 가져오면 검증하는 건이해가 됐습니다.그러다 문득 궁금해진 게, 저희가 테스트할 때는포스트맨을 통해 헤더의 Authorization에 토큰을직접 넣어주었습니다. 하지만 실제 어플리케이션에선사용자가 직접 이 작업을 하지는 않죠.그렇다면 사용자 요청 헤더의 Authorization에 토큰을포함해야 하는 건 서버 측에서 해야할 일 같은데이에 대한 강의는 없는 것 같습니다. 혹시 자세하게는아니라도 대충 어떠하게 흘러가는 지 알려주실 수있을까요??
 - 
      
        
    미해결따라하며 배우는 리액트 A-Z[19버전 반영]
데이터가 2번 호출되는 문제
동일하게 코드를 작성해보았는데 fetchPosts 함수가 2번 실행되어 포스트 리스트에 데이터가 2번 중복으로 들어갑니다.강의에서도 19분 12초를 보니 2번 호출이 되는 것으로 보입니다. useEffect(() => { dispatch(fetchPosts()); }, [dispatch]);이 부분이 2번 실행되는 문제 같아서 버튼 클릭할 때 fetchPosts 함수를 dispatch하는 방식으로 바꾸었더니 데이터가 1번만 요청됩니다. const handleClick = () => { dispatch(fetchPosts()); };useEffect를 사용해서 페이지 접속 시 자동으로 데이터가 1번만 호출되게 하고 싶은데 어떻게 수정해야 할까요? useEffect(() => { dispatch(fetchPosts()); }, []);이렇게 수정해도 2번 실행됩니다..ㅠㅠ
 - 
      
        
    미해결Practical Testing: 실용적인 테스트 가이드
인자값을 LocalDateTime을 전달받는 경우 통합테스트에서는 어떻게 처리 되나요?
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.안녕하세요. 강의를 열심히 보고 있는 수강자입니다.다름이 아니라 이번 강의를 보면서 궁금한 점이 있는데요! LocalDateTime을 인자값으로 전달받아 단위테스트하기 좋게 리팩토링하셨는데, 나중에 createOrder를 호출하는 객체의 통합테스트를 진행할때는 시간에 대한 테스트코드를 어떻게 처리하는지 궁금합니다.예를 들어 CafeKioskRunner에서 main 메서드를 통합 테스트한다고 했을 때 시간에 따라 createOrder에서 성공 또는 exception이 발생할 것 같아서 이것에 대한 통합테스트를 어떻게 처리하는지 궁금합니다.감사합니다.
 - 
      
        
    미해결Practical Testing: 실용적인 테스트 가이드
수강 내용 포스팅 관련 질문 드립니다.
평소에도 기록하는 습관이 있어 개발자로서 학습을 진행하거나 개발자로서 무언가 했던 행동들을 포스팅하여 기록해나가고 있는 신입개발자입니다. 혹시 강의 관련해서 수강한 내용을 바탕으로 강의 출처 및 링크 남기고 포스팅을 해도 되는지 질문 드립니다. 강의 내에서 사용한 이미지나, 코드 같은 것들은 사용하지 않고 테스트에 관련되어 강의 해주신 개념이나, 샘플 소스는 따로 공부한 내용을 바탕으로 제작하여 포스팅 할 예정입니다. 불가능하다면 노션으로 기록하여 PDF 보관할 예정입니다.
 - 
      
        
    해결됨Practical Testing: 실용적인 테스트 가이드
Business Layer(3) 51:56 에 단축키 질문드립니다.
안녕하세요 선생님!51:56 쯤에 쓰시는 일정범위로 스크롤하시면서 select 하는 단축키가 어떤 건지 여쭤보고 싶습니다!강의 화면에 단축키가 안 뜨고, Intellij Keymap 에서 Selection 관련해서 계속 찾아봤는데도 잘 안 보이네요 🥲좋은 강의 감사드립니다 :)
 - 
      
        
    미해결따라하며 배우는 리액트 A-Z[19버전 반영]
axios 설치 오류
안녕하세요!npm install axios --save 명령어로 axios를 설치하였는데이런 문구가 나왔습니다. 혹시 설치가 안된것인가요? 그 이후에 수업을 진행하여"이미지 배너 만들기" 수업을 듣고 코드를작성 후 실행을 하니 영화에 정보가 나오지 않고이런 오류들이 나옵니다.api 키도 사이트에서 잘 가져왔는데.. 혹시 axios 설치가 안되어서 나오는 오류 일까요?
 - 
      
        
    미해결따라하며 배우는 리액트 A-Z[19버전 반영]
window.removeEventListener("scroll", () => {});
안녕하세요 강사님🙇♀️다름이 아니라, removeEventListener와 관련되어 질문이 있습니다. 1. window.removeEventListener("scroll", () => {});에서 함수 부분에 아무것도 적어주지 않았는데, 빈 함수를 전달한다면 어떤걸 의미하는건가요? addEventListener과 같은 함수를 적어줘야 하지 않나요?처음 리액트를 공부하는 거라, 많이 부족합니다ㅠㅠ 바쁘시겠지만 도움주시면 감사하겠습니다!(아래는 참고자료 겸 전체코드 첨부드립니다.)import React, { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import "./Nav.css"; export default function Nav() { const [show, setShow] = useState(false); const [searchValue, setSearchValue] = useState(""); const navigate = useNavigate(); useEffect(() => { window.addEventListener("scroll", () => { console.log("window.scrollY", window.scrollY); if (window.scrollY > 50) { setShow(true); } else { setShow(false); } }); return () => { window.removeEventListener("scroll", () => {}); }; }, []); const handleChange = (e) => { setSearchValue(e.target.value); navigate(`/search?q=${e.target.value}`); }; return ( <nav className={`nav ${show && "nav__black"} `}> <img alt="Netflix logo" src="https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/170px-Netflix_2015_logo.svg.png" className="nav__logo" onClick={() => (window.location.href = "/")} /> <input value={searchValue} onChange={handleChange} className="nav__input" type="text" placeholder="영화를 검색해주세요." /> <img alt="User logged" src="https://occ-0-4796-988.1.nflxso.net/dnm/api/v6/K6hjPJd6cR6FpVELC5Pd6ovHRSk/AAAABbme8JMz4rEKFJhtzpOKWFJ_6qX-0y5wwWyYvBhWS0VKFLa289dZ5zvRBggmFVWVPL2AAYE8xevD4jjLZjWumNo.png?r=a41" className="nav__avatar" /> </nav> ); }
 - 
      
        
    해결됨Practical Testing: 실용적인 테스트 가이드
ActiveProfiles("test")를 대체할 수 있는 다른 방법이 있을까요?
안녕하세요 선생님, 먼저 좋은 강의 감사드립니다. 로컬환경과 테스트 환경을 별도로 관리해주기 위해서, test 프로파일을 사용하는 것은 이해했습니다.그런데, 이렇게 되면 모든 클래스에 ActiveProfiles 를 붙여줘야하니 다소 번거로울 것 같습니다.제가 생각한 방법으로는 SpringBootTest와 ActiveProfiles를 묶는 어노테이션을 별도로 만들고, 만든 어노테이션을 이용해볼 것 같습니다.혹시 ActiveProfiles 를 대체하기 위한 또 다른 방법은 어떤 것들이 있을까요?좋은 강의 감사드립니다 :)
 - 
      
        
    해결됨Practical Testing: 실용적인 테스트 가이드
안녕하세요. 객체의 책임 분리와 관련해서 질문이 있습니다.
안녕하세요. "private 메서드 테스트는 어떻게 하나요?" 강의를 들으며 객체의 책임 분리에 대하여 질문드릴 것이 있습니다.객체의 책임 분리를 위해 별도의 Class를 만들고 객체를 생성해서 해당 객체에게 특정 책임을 부여하려면 결국에 별도의 Class를 만들어야 한다는 것이 전제될텐데요.현재 제가 일하는 곳에서 대표님이 Class가 많이 늘어나게 되면 유지보수가 어렵게 되고 코드가 지저분해질 수 있다고 하신 적이 있습니다. 전 객체지향 관점에서 한 객체가 모든 걸 다 하고 한 메서드가 너무 많은 행위를 하는 것이 좋지 않다고 생각하는데 우빈님은 혹시 제가 들은 대표님의 말씀에 대해 어떻게 생각하시는지 궁금합니다.
 - 
      
        
    미해결Java/Spring 주니어 개발자를 위한 오답노트
Controller / application Service / Domain 의 역할 구분
안녕하세요 강의 잘 듣고 있습니다.헥사고날 아키텍쳐 부분 강의를 듣고, 궁금한 부분이 새겨서 질문 남깁니다!Application Service(이하 서비스) 에서 도메인부분을 분리 하여 객체의 상태 변화에 대한 부분을 처리하도록 하고, 서비스에선 Repository와 소통해서 필요한 객체나 컨트롤러에서 정보(예를 들어 수정 정보 등등) 등등을 얻어서 도메인 부분에 위임한다고 이해했습니다. 그렇게 도메인 영역을 분리하면 테스트에 용이하다는 것은 이해했습니다. 그런데 실제로 토이프로젝트에 적용해보려고 코드를 수정하는 중에 예를 들어 게시글을 수정하는 과정이라면 컨트롤러에서 처음 요청을 받을 때 postId, updateRequest를 받아서 서비스에 업데이트를 요청하고, 다시 서비스에선 아이디를 통해 Post를 찾고, PostDomainService(가칭)에 Post와서 updateRequest를 넘겨 수정한다면 거의 같은 내용의 파라미터를 굳이 2 계층을 건너 불필요한 위임이 반복 된다고 생각했습니다. 궁금한 것은 2가지 입니다.이런 경우엔 PostDomainService 클래스를 만들기보단 Post 객체 자체에서 업데이트를 처리하는 것이 맞을까요? - (1번 코드)도메인과 도메인 서비스의 차이는 객체의 상태(도메인)와 객체의 행동(도메인 서비스) 일까요? 엔티티와 도메인의 구분이 잘 이해가 되지 않습니다. //== 업데이트 로직 ==// public void updateInfo(PostUpdateReqDto updatePost) { this.title = updatePost.getTitle(); this.content = updatePost.getContent(); } // 기존 서비스에서의 로직 @Transactional public PostUpdateResDto updatePost(final Long postId, final PostUpdateReqDto postUpdateReqDto) { Post findPost = postRepository.findWithMemberByPostId(postId); Post updatedPost = postDomainService.updatePost(findPost, postUpdateReqDto); // 위 과정에 생기면 사라지는 메서드 // findPost.updateInfo(postUpdateReqDto); checkForbiddenWord(findPost); return new PostUpdateResDto(findPost); }
 - 
      
        
    미해결따라하며 배우는 리액트 A-Z[19버전 반영]
useParams를 이용한 영화 상세 페이지 구현하기
useParams를 이용한 영화 상세 페이지 구현하기에서 가져올 useParams에 파라미터 값이 movieId인 것을 어떻게 확인할 수 있을까요 ?
 - 
      
        
    해결됨Practical Testing: 실용적인 테스트 가이드
lesson5-5 Order Entity의 registeredDateTime 컬럼
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.질문Order Entity가 상속 받는 BaseEntity에 createdDateTime 컬럼이 있음에도 registerdDateTime 컬럼을 추가하는 이유는 무엇인가요? 외부결제API에서 제공하는 결제일시를 저장하기 위함인가요?
 - 
      
        
    해결됨Practical Testing: 실용적인 테스트 가이드
안녕하세요 선생님 질문 있습니다 !
이제 막 java, spring, mysql , 프론트 부분 기초적인 부분 공부를 끝마친 학생입니다.항상 테스트 코드의 중요성을 많은 커뮤니티에서 봐오고 강조하는 분들이 많아서언젠간 배워야겠다 싶은 찰나에 수강 결제를 미리 하게 되었습니다.혹시 선생님 수업을 듣기 전, 미리 좀 더 배워둬야 하거나알아둬야 하는 부분이 있을까요 ?
 - 
      
        
    해결됨스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션
로그인 인증 실패 시 예외처리하는 주체는 어느 것인가요?
기존에는 SecurityConfig 클래스의SecurityFilterChain에서 아래의 코드가로그인 실패 시 응답을 처리하는 주체였습니다. http.exceptionHandling() // 인증 예외 설정 .authenticationEntryPoint((request, response, authenticationException)->{ // 예외 가로채기\ CustomResponseUtil.fail(response, "로그인을 진행해주세요", HttpStatus.UNAUTHORIZED); });그러다 JwtAuthenticationFilter를 만들면서attemptAuthentication() 매서드가 실패 시 아래의unsuccessfulAuthentication()가 실행되게끔 했구요.@Override protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException { CustomResponseUtil.fail(response, "로그인 실패", HttpStatus.UNAUTHORIZED); } 그래서 헷갈려서 실험해보니 기존의 SecurityFilterChain의 것은 주석처리해도 아무런상관이 없고, unsuccessfulAuthentication()가 동작하더라구요.이 두 코드의 차이는 정확히 어떤 것일까요?
 - 
      
        
    해결됨Practical Testing: 실용적인 테스트 가이드
빌더 사용에 대해 질문드립니다!
안녕하세요 선생님. 빌더를 사용하시는 것을 보고 흥미가 동해 질문남깁니다!선생님께서는 예제의 경우 대부분 생성자를 private으로 막아두고 빌더를 통해서만 객체를 생성하시는 것 같습니다.저는 필드 개수가 많아도 public 생성자로 열어두는 편인데, 그 이유는어떤 인자를 전달해야할지 인텔리제이의 힌트로 알아채기도 편하고필드가 null 일 수도 있는 경우 객체를 생성할 때 명시적으로 null 이 보이는게 낫다 라고 생각해서입니다. null을 명시적으로 인자로 전달하는 것이 불편하다면 텔레스코핑을 통해 생성자를 조금 더 만들어두기도 합니다 :)물론 빌더 패턴을 사용하면 이런 코드들이 전부(?) 사라지기는 하지만, 이 외에 빌더로 객체 생성을 강제하는 것에 대한 장점이 있는지 궁금합니다! 또, 선생님만의 빌더랑 생성자 선택 기준이 따로 있을까요? 마지막으로 실무에서도 자주 사용하시는지 궁금합니다. 좋은 강의 감사드립니다 :)
 - 
      
        
    미해결따라하며 배우는 리액트 A-Z[19버전 반영]
async await
안녕하세요. banner.js에서 질문이 있습니다이 부분에서 왜 async await를 사용하셨는지 궁금합니다!const fetchData = async () => { // 현재 상영중인 영화 정보를 가져오기(여러 영화) const request = await axios.get(requests.fetchNowPlaying); // 여러 영화 중 영화 하나의 ID를 가져오기 const movieId = request.data.results[ Math.floor(Math.random() * request.data.results.length) ].id; // 특정 영화의 더 상세한 정보를 가져오기(비디오 정보도 포함) const { data : movieDetail } = await axios.get(`movie/${movieId}`, { params: {append_to_response: "videos"}, }); setMovie(movieDetail); }
 - 
      
        
    해결됨Java/Spring 주니어 개발자를 위한 오답노트
테스트 하기 쉬운 코드에서 테스트의 범위?
영상에서 종종 "테스트 하기 좋은 코드는 잘 설계된 코드일 것이다." 라는 말을 해주셨습니다. 어떤 테스트를 기준으로 테스트 하기 좋은 코드가 잘 설계된 코드일까요?- 예를 들어 단위 테스트, 통합 테스트, 인수 테스트가 존재한다 하면, 세가지 테스트 중 어떤 테스트를 테스트하기 편한 코드를 기준으로 잡는게 좋을까요?
 - 
      
        
    해결됨Java/Spring 주니어 개발자를 위한 오답노트
스프링에서 서비스 레이어(Apllication Layer) 테스트에 대한 질문입니다.
제 개인 프로젝트를 진행하면서, 서비스 레이어에서는 단순히, 도메인 레이어에 존재하는 다른 객체들을 호출해서 비즈니스 로직을 처리하는 책임만을 담당하다보니, 서비스 레이어에 존재하는 객체를 테스트하는 코드를 작성하게 되면 대부분 테스트할 내용이, 메소드의 실행순서를 올바르게 실행해줬는가? 와 같은 부분만 테스트할게 없었는데 이 부분이 제가 잘못 설계한 부분이 아닌 오히려, 객체간의 책임을 잘 나누고 서비스 레이어의 책임에 맞게 코드를 작성한것 같다는 확신을 강의를 보고나서 알수 있었습니다 좋은 강의 감사합니다😊