173만명의 커뮤니티!! 함께 토론해봐요.
해결됨
오브젝트 - 설계 원칙편
이제 꼭 함수형 언어를 사용하지 않더라도 요즘 언어들 대부분 함수형 언어의 아이디어나 장점들을 반영하는 트렌드인데, 회사에서도 코틀린을 사용 중이라 질문 드려봅니다. 코틀린 라이브러리들을 사용하다 보면 함수형 스타일의 설계와 API들을 꽤 많이 보고 있기도 하고 특히 람다를 굉장히 많이 사용하는데 적절하게 람다나 함수형 스타일의 코드를 사용하는 기준이나 원칙들도 있으신지 궁금하네요.
빡소리
2025-07-06T13:10:00.338Z
댓글 2
좋아요 1
조회수 143
해결됨
오브젝트 - 설계 원칙편
안녕하세요. 항상 객체 지향의 본질을 가르쳐주시는 강의 정말 잘 듣고 있습니다. 실무에서 JPA를 사용할 때 값 객체 활용에 대해서도 궁금합니다. RDB 기준 하나의 테이블에 매핑되는 경우말고, 값 객체를 별도의 테이블로 매핑해야될 경우에도 많이 사용하시는지 궁금합니다.
빡소리
2025-07-05T02:57:34.342Z
댓글 2
좋아요 1
조회수 173
미해결
테스트 with Jest: 제로초에게 제대로 배우기
강의 안에 교안 얘기가 있는데 강의 교안이 어디있나요?
supertest jest 소프트웨어-테스트 unittest
Rachel
2025-06-29T11:25:38.277Z
댓글 2
좋아요 0
조회수 134
미해결
Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
Maven resources compiler 어쩌구 자바 버전 문제 제 기준 pom.xml에서 java.version 21로 올리고 프로젝트 설정에서 SDK/모듈도 동일하게 설정했더니 해소 됐습니다 NoSuchFieldError 어쩌구 lombok 버전이 자바 버전과 안 맞음. pom.xml lombok dependency의 버전을 자바랑 맞추기 https://jinseobbae.github.io/java/2023/02/27/lombok-version-compatibility.html Unsupported class file major version 65 스프링부트 버전 문제 3.3.0으로 올리니까 해소됐습니다
spring tdd jpa 소프트웨어-테스트 unittest
태태건
2025-06-25T05:59:37.483Z
댓글 1
좋아요 0
조회수 135
해결됨
오브젝트 - 설계 원칙편
영호님 강의 잘 들었습니다. 객체지향적인 설계에 대한 근원이되는 내용에 관심이 많아 영호님의 서적과 강좌를 자주 보게 되네요 본론 시중에 나와 있는 서적과 강좌가 정말 잘 되어 있는 만큼 사람들이 많이 사용하는 스프링 프레임워크에 적용한 예제도 가끔 있으면 어떨까 합니다. 생각보다 이 부분이 제 주변인들의 가려운 부분이었어요 예를 들면 스프링을 사용하는 가정하에 비즈니스 계층에 적용해야하는데, 다형성이 필요한 서비스의 경우 "인터페이스 - 구현체" 로 구축시 구현체들을 Spring Bean으로 사용할 경우, 컴파일 시 구체적인 구현체가 아니라 에러가 나는데 이럴때는 구현체를 매핑해주는 팩토리를 생성해서 사용해야된다 와 같은 다소 객체지향과는 동떨어지지만 소소한 설명이 언급되어도 좋을 것 같습니다. 아마 강좌나 서적을 보는 많은 사람들이 비슷한 생각일 것 같습니다. "이 부분을 만약에 업무에 적용시킨다면 어떻게 해야 할까나?" 대부분 이런 생각이지 않을까 해서 드린 말씀입니다. 항상 고품질의 강좌와 서적을 위해 애써주시는 영호님께 다시 한 번 감사드립니다.
ycseol
2025-06-23T23:27:12.291Z
댓글 3
좋아요 2
조회수 612
미해결
실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트
expect(screen.getByTestId('cart-icon')).toBeInTheDocument(); expect( await screen.findByRole('button', { name: 'Maria' }), ).toBeInTheDocument(); expect(screen.getByText('2')).toBeInTheDocument(); 영상의 테스트 코드는 통과하는데, 위와 같이 두번째와 세번째 단언문을 바꾸면 실패합니다. 왜이런가요?
javascript react 소프트웨어-테스트 vitest
Einere
2025-06-22T08:07:35.915Z
댓글 2
좋아요 0
조회수 136
해결됨
SW 역량테스트 합격하기 A형 with C++ (Advanced Algorithm)
안녕하세요, BOJ 16935번 문제를 풀던 중 시계 방향 회전(clockwise) 과 반시계 방향 회전(counterClockwise) 함수의 구현 방식 차이에 대해 헷갈리는 부분이 있어 질문드립니다. (강의 6:22) // 시계 방향 회전 void clockwise() { copyMAP(temp, MAP); int t = N; N = M; M = t; for (int r = 1; r <= N; r++) { for (int c = 1; c <= M; c++) { MAP[r][c] = temp[M + 1 - c][r]; } } } // 반시계 방향 회전 void counterClockwise() { copyMAP(temp, MAP); int t = N; N = M; M = t; for (int r = 1; r <= N; r++) { for (int c = 1; c <= M; c++) { MAP[r][c] = temp[c][N + 1 - r]; } } } 궁금한 점은, clockwise() 에서는 temp[M + 1 - c][r] 처럼 회전 전의 N, M 기준으로 접근 하는거고, counterClockwise() 에서는 temp[c][N + 1 - r] 처럼 바뀐 후의 N, M을 그대로 사용 하는 건가요? 이 부분이 좀 헷갈려서 질문 드립니다. 감사합니다.
xeexae0808
2025-06-20T08:21:05.706Z
댓글 1
좋아요 0
조회수 158
해결됨
오브젝트 - 설계 원칙편
안녕하세요, 강의 잘 듣고 있습니다. 객체 비교에 대한 설명 중, ‘동일성(identity)’과 ‘동등성(equality)’ 의 개념이 일반적인 프로그래밍 용어와 다르게 설명된 부분이 있는 것 같아 확인 요청드립니다. 강의에서 설명된 내용은 다음과 같습니다: (4-1, 4-2에서) 속성 기반 ‘동일성(equality)’ 모든 변수가 동일한 객체 참조 -> ‘동등성(identical)’ 하지만 일반적으로 다음과 같이 구분됩니다: 동일성: 참조가 같다, identical, 메모리 상에서 같은 객체를 가리킴 동등성: 값이 같다, equality, 서로 다른 객체여도 내용이 같다. 한 번 확인해주시면 감사드리겠습니다. 감사합니다!
nnngngn..
2025-06-17T08:17:28.267Z
댓글 2
좋아요 1
조회수 151
해결됨
오브젝트 - 설계 원칙편
Schedule 클래스는 RecurringPlan을 반환하는데, 갑자기 인터페이스명이 TemporalExpression으로 되어서 헷갈립니다!
김철준
2025-06-14T03:35:14.572Z
댓글 2
좋아요 0
조회수 136
미해결
따라하며 배우는 리액트 A-Z[19버전 반영]
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. import axios from "../api/axios"; import React, { useEffect, useState } from 'react' import requests from '../api/requests'; import "./Banner.css" import styled from "styled-components"; export default function Banner() { const [movie, setMovie] = useState([]); const [isClicked, setIsClicked] = useState(false); useEffect(() => { fetchData(); }, []); 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); } const truncate = (str, n) => { return str?.length > n ? str.substr(0, n - 1) + "..." : str; } console.log('movie', movie); if(!isClicked) { return ( <header className="banner" style={{ backgroundImage: `url("https://image.tmdb.org/t/p/original/${movie.backdrop_path}")`, backgroundPosition: "top center", backgroundSize: "cover", }}> <div className="banner__contents"> <h1 className="banner__title"> {movie.title || movie.name || movie.original_name} </h1> <div className="banner__buttons"> <button className="banner__button play" onClick={() => setIsClicked(true)} > Play</button> <button className="banner__button info">More Information</button> </div> <h1 className="banner_description"> {truncate(movie.overview, 100)} </h1> </div> <div className="banner--fadeBottom"></div> </header> ); } else{ return ( <Container> <HomeContainer> <Iframe width="640" height="360" src={`https://www.youtube.com/embed/${movie.videos.results[0].key}?controls=0&autoplay=1&loop=1&mute=1&playlist=${movie.videos.results[0].key}`} title="YouTube video player" allow="autoplay; fullscreen" ></Iframe> </HomeContainer> </Container> ); } } const Iframe = styled.iframe` width: 100%; height: 100%; opacity: 0.65; border: none; &::after { content:""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; }` const Container = styled.div` display: flex; justify-content: center; align-items: center; flex-direction: column; width: 100%; height: 100vh; ` const HomeContainer = styled.div` width: 100vw; height: 100vh;`
react redux tdd typescript next.js 소프트웨어-테스트
hundo1217
2025-06-11T07:23:07.220Z
댓글 1
좋아요 0
조회수 130
미해결
따라하며 배우는 리액트 A-Z[19버전 반영]
강의대로 따라갔는데 강의처럼 렌더링이 되고 있지 않습니다 ㅠㅠ 어디가 문제일까요 chatgpt는 서버가 없다 뭐 이렇다는데 ㅠㅠ 출력 화면 Nav.js import React, { useEffect, useState } from 'react' import"./Nav.css" export default function Nav() { const [show, setShow] = useState(false); useEffect(() => { window.addEventListener("scroll", ()=> { console.log('window.scrollY', window.scrollY); if(window.scrollY > 50) { setShow(true); } else { setShow(false); } }) return () => { window.removeEventListener("scroll", ()=> {}); }; }, []); 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/960px-Netflix_2015_logo.svg.png" decoding="async" width="799" height="216" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/1198px-Netflix_2015_logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/1597px-Netflix_2015_logo.svg.png" className='nav__logo' onClick={() => window.location.reload()} /> <img alt = "User logged" src = "https://occ-0-3077-988.1.nflxso.net/dnm/api/v6/vN7bi_My87NPKvsBoib006Llxzg/AAAABTZ2zlLdBVC05fsd2YQAR43J6vB1NAUBOOrxt7oaFATxMhtdzlNZ846H3D8TZzooe2-FT853YVYs8p001KVFYopWi4D4NXM.png?r=229" className="nav__avatar" /> </nav> ); } Nav.css .nav{ position: fixed; top: 0; width: 100%; height: 30px; z-index: 1; padding: 20px; display: flex; justify-content: space-between; align-items: center; transition-timing-function: ease-in; transition: all 0.5s; } .nav__black { background-color: #111; } .nav__logo{ position: fixed; left: 40px; width: 80px; object-fit: contain; } .nav__avatar { position: fixed; right: 40px; width: 30px; object-fit: contain; } Banner.js import axios from "../api/axios"; import React, { useEffect, useState } from 'react' import requests from '../api/requests'; import "./Banner.css" export default function Banner() { const [movie, setMovie] = useState([]); useEffect(() => { fetchData(); }, []); 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_reponse: "videos"} }); setMovie(movieDetail); } const truncate = (str, n) => { return str?. length > n ? str.substr(0, n - 1) + "..." : str; } return ( <header className="banner" style={{ backgroundImage: `url("https://image.tmdb.org/t/p/original/${movie.backdrop_path}")`, backgroundPosition: "top center", backgroundSize: "cover" }}> <div className="banner__contents"> <h1 className="banner__title"> {movie.title || movie.name || movie.original_name} </h1> <div className="banner__buttons"> <button className="banner__button play">Play</button> <button className="banner__button info">More Information</button> </div> <h1 className="banner_description"> {truncate(movie.overview, 100)} </h1> </div> <div className="banner--fadeBottom"></div> </header> ) } Banner.css .banner{ color: white; object-fit: contain; height: 448px; } @media (min-width : 1500px) { .banner{ position: relative; height: 600px; } .banner--fadeBottom{ position: absolute; bottom: 0; width: 100%; height: 40rem; } } @media (max-width : 768px) { .banner__contents{ width: min-content !important; padding-left: 2.3rem; margin-left: 0px !important; } .banner--description{ font-size: 0.8rem !important; width: auto !important; } .info{ text-align: start; padding-right: 1.2rem; } .space{ margin-left: 6px; } } axios.js import axios from "axios"; const instance = axios.create({ baseURL: "https://api.themoviedb.org", params: { api_key: "eea00451962aefe6185011d467944242", language: "ko-KR", }, }); export default instance; requests.js const requests = { fetchNowPlaying: "movie/now_playing", fetchNetFlixOriginals: "/discover/tv?with_networks=213", fetchTrending: "/trending/all/week", fetchTopRated: "/movie/top_rated", fetchActionMovies: "/discover/movie?with_genres=28", fetchComedyMovies: "/discover/movie?with_genres=35", fetchHorrorMovies: "/discover/movie?with_genres=27", fetchRomanceMovies: "/discover/movie?with_genres=10749", fetchDocumentaries: "/discover/movie?with_genres=99", } export default requests;
react redux tdd typescript next.js 소프트웨어-테스트
hundo1217
2025-06-11T00:42:16.016Z
댓글 1
좋아요 0
조회수 143
해결됨
오브젝트 - 설계 원칙편
player 내부에 worldmap이 있는 것은 좀 어색하다고 느껴지는데 game에 있어야 하지 않을까요??
김철준
2025-06-08T10:37:56.402Z
댓글 2
좋아요 3
조회수 177
미해결
실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트
뒤로 이동 버튼을 눌러 페이지 전환이 잘 되었음을 검증하고 싶으면 history web api 등을 이용해서 검증하는게 더 올바르지 않나요?? 왜 useNavigate 의 반환 함수의 인자로 검증하는지 궁금합니다~
javascript react 소프트웨어-테스트 vitest
Einere
2025-06-08T06:40:15.807Z
댓글 2
좋아요 0
조회수 147
해결됨
오브젝트 - 설계 원칙편
이 코드에서 Game은 GameLoop만 알지만 Cui, Gui는 GampLoop와 Game을 동시에 알죠. 즉 Gamp과 Cui, Gui은 쌍방향 참조로 봐야하지 않을까요. 실제 Game을 수정하면(exe로 메소드명을 바꾼다던가) Gui, Cui도 수정해야하니까요.
Hika Maeng
2025-06-05T12:39:04.137Z
댓글 2
좋아요 0
조회수 149
해결됨
오브젝트 - 설계 원칙편
astractreader인데...
Hika Maeng
2025-06-05T11:52:52.804Z
댓글 2
좋아요 0
조회수 106
해결됨
오브젝트 - 설계 원칙편
parser..
Hika Maeng
2025-06-05T11:15:42.242Z
댓글 2
좋아요 0
조회수 80
해결됨
오브젝트 - 설계 원칙편
parser..
Hika Maeng
2025-06-05T11:15:38.335Z
댓글 2
좋아요 0
조회수 80
해결됨
오브젝트 - 설계 원칙편
이 그림 자체의 문제라기보다 도출되는 과정의 문제인데요. 과정을 보면 JsonReader와 CsvReader의 코드를 관찰한다. 공통점을 발견한다. 상위모듈에 그 공통점을 기술한다. 이렇게 했단 말이죠. 헌데 이건 하위모듈의 구현상의 공통점으로 xml리더나 html리더를 만들 때도 그 공통점이 일어난다고 보장할 수는 없을 거에요. 특히 이 코드는 전적으로 로컬파일시스템에서 읽을 때나 readLines가 일치하지 원격파일 리소스에서 읽어 들일 때는 그렇지도 않죠. 즉 하위 구현에서 얼마든지 공통점은 달라질 수 있는데 그걸 단단한 상위모듈에 모아서 정의해도 되냐는 것입니다. 저는 인터페이스까지는 몰라도 추상클래스는 하위모듈에 있어야한다고 생각이 듭니다.
Hika Maeng
2025-06-05T11:07:02.706Z
댓글 2
좋아요 0
조회수 88
해결됨
오브젝트 - 설계 원칙편
이걸 정말 실무에서 실현하시는지 궁금해요. 이건 뭐랄까 정말 이론적인 얘기 같아요. 이 예제가 아주 적절한데, 보통 저런 구조의 별도 모듈에 구현되는 하위수준의 기능은 라이브러리이거나 스탠드얼론 생태계를 갖는게 일반적이죠. 이건 실무적으로 보면 잭슨이 우리회사 인터페이스에 따라서 만들어져야한다 라고 말하는 것에 가까운 느낌이랄까, 저는 실무적에서 기능 모듈의 인터페이스가 도메인 모듈에 소속되게 만든 경험이 아예 없는 거 같아요. 소시적에 이론 따라 몇 번 해봤는데 완전 별로였거든요.
Hika Maeng
2025-06-05T11:00:06.753Z
댓글 2
좋아요 0
조회수 81
해결됨
오브젝트 - 설계 원칙편
(사진)
Hika Maeng
2025-06-05T10:53:32.467Z
댓글 2
좋아요 0
조회수 42