해당 강의 이후에 수정하시는지 모르겠지만 닉네임이 제대로 적용되어있지 않는 것 같습니다. // MsgList.js <MsgItem ... user={...} /> 현재 해당 강의 시점에서 user을 넘기고 user.nickname으로 표시를 하게 되어 있는데 { id: 'roy', nickname: '로이' } 가 계속 넘어가서 닉네임이 '로이'로만 렌더링되고 있습니다. // MsgList.js <MsgItem ... users={users} /> // MsgItem {users.find(user => user.id === userId).nickname} 저는 일단 이런식으로 수정하였는데 닉네임 부분 한번 확인 부탁드립니다! 혼동이 올 수도 있을 것 같습니다 ㅎㅎ..
npm run build 이 부분에서 계속 오류가 발생합니다..ㅜㅜ PS D:\lecture-frontend-dev-env> npm run build Debugger attached. > lecture-frontend-dev-env@1.0.0 build > webpack Debugger attached. [webpack-cli] [Error: EISDIR: illegal operation on a directory, open 'D:\lecture-frontend-dev-env\dist\main.js'] { errno: -4068, code: 'EISDIR', syscall: 'open', path: 'D:\\lecture-frontend-dev-env\\dist\\main.js' } Waiting for the debugger to disconnect... Waiting for the debugger to disconnect...
안녕하세요 강의를 쭉 듣다가 단위테스트가 어렵다는 단점이 잘 이해가 가지 않아 질문드려봅니다. 예를 들어 빈스코프 파트-DL 부분 중 스프링 컨테이너를 주입하여 프로토타입 빈을 계속 새롭게 생성했때 - 단점이 스프링 컨테이너에 종속적이어서 단위테스트가 어려운것으로 설명이 되어 있습니다. 여기에서 다른 부분에서도 (의존성 필드 주입) 단위테스트가 어렵다 이런부분이 나오는데, 이것이 왜 어려운 것인지 잘 모르겠습니다. DL 방식 중 Provider 를 사용하지 않고 스프링 컨테이너를 필드에 저장해서 새로운 프로토타입 빈을 생성하는 방법 역시 필드에 @Autowired 해서 의존성 주입을 받는데, 이것이 필드 주입때문에 단위테스트가 어렵다고 연계되는것일까요?
선생님 안녕하세요, 퀄리티 너무 좋은 수업 덕분에 하루하루 배우는 재미가 있네요. 이런 기회를 주셔서 정말 감사드립니다. 공부를 하다가 질문이 있어서 질문을 남겨요! 제가 적용하려는 데이터의 타겟값이 -1 or 1 인 상태입니다. 현재 logloss가 eval_metric이어서 그런지, 타겟값이 -1 or 1 인 상태로 넣으면 에러가 나와서, 첫 3줄의 코드를 통해서 타겟값이 -1 인 경우는 0으로 바꾸었더니 돌아갑니다. 여기서 궁금한게 생긴게, 1) validation-logloss 값이 음수가 나오더군요! (똑같은 데이터를 Dmatrix를 구해서 똑같이 XGBoost를 적용할 때는 그러지 않았는데 wrapper를 사용할때는 왜 음수가 나오기 시작하는지 조언을 주실 수 있을까요?) 또한, logloss 값 자체가 음수가 나올 수 없는게 아닌가 싶어서 좀 찾아보니, https://stackoverflow.com/questions/26282884/why-is-the-logloss-negative 에서 설명이 나와있던데, 이 설명으로서는 잘 이해가 안되네요. 2) 똑같은 데이터에 대해서 아래와 같이 LightGBM를 적용하려고 하였습니다. n_estimator = 1000 이고, early_stopping_rounds = 50 인데도 100번째 이터레이션 이후로 값들이 나오지 않더군요. 이럴때는 그냥 100번째 이터레이션이 optimal 한것인가요?
현재 상황 클라이언트와 서버를 각자 다른 도메인에 배포했습니다. 소셜 로그인은 passport 모듈과 session을 사용했습니다. 서버에서 소셜 로그인이 성공해도 클라이언트에는 세션 쿠키가 전달되지 않습니다. 클라이언트 axios get 요청을 보내면 cors 에러가 떠서 a 태그를 사용했습니다. <a href="http://서버ip/auth/github">깃 헙 로그인<a/> 서버 아래의 코드는 강의의 내용과 동일합니다. passport 모듈을 활용해 소셜 로그인을 구현했습니다. import express from "express"; import passport from "passport"; import { isLoggedIn, isNotLoggedIn } from "../middlewares/authMiddleware.js"; const router = express.Router(); router.get("/github", passport.authenticate("github")); router.get( "/github/callback", passport.authenticate("github", { failureRedirect: "/", }), (req, res) => { res.redirect(`http://localhost:3000`); } ); router.get("/logout", isLoggedIn, (req, res) => { req.logout(); req.session.destroy(); res.json({ message: "logout" }); }); export default router; 소셜 로그인에 성공하면 클라이언트 서버의 메인 페이지로 redirect 시키고 있습니다. 문의 서버에서 소셜 로그인 성공시 클라이언트 서버에도 session 쿠키를 전달하고 싶습니다. 두 개의 다른 서버에서 소셜 로그인을 어떻게 구현해야될지 모르겠습니다.
안녕하세요! 강의 잘 듣고있습니다. express서버사용해보기 편에서 제로초님이 쓰신 코드 그대로 따라쳐보고 있는데요! nodemon app 을 cmd에 실행했을때 실행이 되지 않는데요 package에서도 nodemon이 확인이 되는데 왜 접근이 안되는 걸까요 ? 감사합니다
아직 현업을 겪어보지 못한 취준생입니다. 강의를 보고 공부를 하던 중 querydsl을 이용해 dto에 fit한 쿼리를 한번에 나오게끔 어찌저찌 짜봤는데요. 공부를 하다 궁금한 점이 생겨서 질문 드립니다. 로직을 위해 한 3번 정도의 쿼리가 나간 뒤 자바 코드로 로직에 맞게 수정하는 것과, 로직을 위해 한번의 쿼리가 나가면서 쿼리가 복잡해지는 것 중 어느게 좋은 쿼리일까요? 제 생각에는 3번의 가독성 좋은 쿼리가 나가는 것이 좋을 것 같습니다. 혹시 현업에서는 아니면 저보다 선배님들은 어떤 식으로 하시는지 궁금합니다.
안녕하세요. 강사님! 지방 사는 비전공자이고 6개월 정도의 교육 후에 취업하고 싶습니다. 자금 상황 때문에 부트캠프 온라인 vs 서울 고시원 살며 국비지원 받기 중 하나를 택하려 합니다.(42서울 등 교육들은 될지로 모르는데다 시기도 좀 기다려야 해서요.100퍼 된다는 보장이 없어서 일단 둘만 놓고 고민합니다) 뭐가 더 나을까요....? 강사님이나 수업 종류에 따라 다를까요?
안녕하세요 강의 항상 잘 보고 있습니다. 몇가지 궁금한 점이 있어서 질문 드립니다! public static void main(String[] args) { SpringApplication.run(QuerydslApplication.class, args); } @Bean JPAQueryFactory jpaQueryFactory(EntityManager em){ return new JPAQueryFactory(em); } 이전 MemberJpaRepository에서 보여주셨던 것과 같이 시작 메소드에서 em을 주입받은 queryFactory를 Bean으로 등록하고, private final JPAQueryFactory queryFactory; public MemberRepositoryImpl(JPAQueryFactory queryFactory){ this.queryFactory = queryFactory; } MemberRepositoryImpl에서 위와 같이 작성하였습니다. 이 상황에서, em이 주입된 queryFactory 싱글톤 빈을 받아서 MemberRepositoryImpl이 생성될 때 그 queryFactory를 주입한다고 생각하면 될까요?? 이렇게 작성하였을 때, basicTest는 통과하였습니다. 하지만 searchTest에서는 result가 비어있었습니다. 그래서 처음에 생각했을 때는, 시작메소드에서 JPAQueryFactory를 빈으로 등록했지만, 여기는 Test이기 때문에 시작 메소드를 실행하지 않았고 따라서 제대로 동작하지 않았다고 생각했었습니다. 하지만 그렇다면 뭔가 컴파일 오류가 난다던지, basicTest가 불통과된다던지 했었을 텐데, 그러지 않은 것을 보니 무언가 다른 이유가 있을거라 생각합니다. 조금 난해한 질문일 수는 있지만, 위와 같은 제 생각의 흐름에서 어떤 부분이 잘못되었는지 말씀해 주실 수 있으실까요?? 또한 condition에서 setTeamName을 제거했을 때는, result를 출력했을 때, member3와 member4가 나왔고 assertThat을 그에 맞게 수정하였더니 Test가 통과되었습니다. 즉, setTeamName 조건을 더했을 때, search가 제대로 동작하지 않는 것인데, 이유가 무엇인지 모르겠습니다. 아래에 전체 코드를 첨부하겠습니다. MemberRepositoryImpl package study.querydsl.repository; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import study.querydsl.dto.MemberSearchCondition; import study.querydsl.dto.MemberTeamDto; import study.querydsl.dto.QMemberTeamDto; import javax.persistence.EntityManager; import java.util.List; import static org.springframework.util.StringUtils.hasText; import static study.querydsl.entity.QMember.member; import static study.querydsl.entity.QTeam.team; //MemberRepository + "Impl" 형식을 맞춰야 한다. public class MemberRepositoryImpl implements MemberRepositoryCustom{ private final JPAQueryFactory queryFactory; //시작 메소드에서 JPAQueryFactory를 스프링 빈으로 등록해둠 //em이 주입된 queryFactory 싱글톤 빈을 받아온 것 //MemberRepositoryImpl이 생성될 때 그 queryFactory를 주입한다. public MemberRepositoryImpl(JPAQueryFactory queryFactory){ this.queryFactory = queryFactory; } @Override //회원명, 팀명, 나이(ageGoe, ageLoe) public List<MemberTeamDto> search(MemberSearchCondition condition) { return queryFactory .select(new QMemberTeamDto( member.id, member.username, member.age, team.id, team.name)) .from(member) .leftJoin(member.team, team) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())) .fetch(); } private BooleanExpression usernameEq(String username) { return hasText(username) ? member.username.eq(username) : null; } private BooleanExpression teamNameEq(String teamName) { return hasText(teamName) ? member.username.eq(teamName) : null; } private BooleanExpression ageGoe(Integer ageGoe) { return ageGoe == null ? null : member.age.goe(ageGoe); } private BooleanExpression ageLoe(Integer ageLoe) { return ageLoe == null ? null : member.age.loe(ageLoe); } } MemberRepositoryTest package study.querydsl.repository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import study.querydsl.dto.MemberSearchCondition; import study.querydsl.dto.MemberTeamDto; import study.querydsl.entity.Member; import study.querydsl.entity.Team; import javax.persistence.EntityManager; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest @Transactional class MemberRepositoryTest { @Autowired EntityManager em; @Autowired MemberRepository memberRepository; @Test public void basicTest() { Member member = new Member("member1", 10); memberRepository.save(member); Member findMember = memberRepository.findById(member.getId()).get(); assertThat(findMember).isEqualTo(member); List<Member> result1 = memberRepository.findAll(); assertThat(result1).containsExactly(member); List<Member> result2 = memberRepository.findByUsername("member1"); assertThat(result2).containsExactly(member); } @Test public void searchTest() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); MemberSearchCondition condition = new MemberSearchCondition(); condition.setAgeGoe(35); condition.setAgeLoe(40); condition.setTeamName("teamB"); List<Member> all = memberRepository.findAll(); List<MemberTeamDto> result = memberRepository.search(condition); System.out.println("all = " + all); System.out.println("result = " + result); assertThat(result).extracting("username").containsExactly("member4"); } } 이때 다음과 같이 변경하면 테스트가 통과됩니다. @Test public void searchTest() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); MemberSearchCondition condition = new MemberSearchCondition(); condition.setAgeGoe(30); condition.setAgeLoe(40); // condition.setTeamName("teamB"); List<Member> all = memberRepository.findAll(); List<MemberTeamDto> result = memberRepository.search(condition); System.out.println("all = " + all); System.out.println("result = " + result); assertThat(result).extracting("username").containsExactly("member3", "member4"); }