안녕하세요! querydsl 강의를 보고 실무에 적용 하던 중 중첩 객체에 대해서 한번의 join query로 만들 수 없을지 궁금하여 질문 드립니다. 만약, A -< B -< C (-< 은 one to many 를 의미) 관계를 가진 객체가 있다고 할 때 selectFrom(A) .leftJoin(A.B) .leftJoin(A.B.C) .where(A.id.eq(1)) .fetch(); 위 코드의 반환 값이 아래와 같기를 희망 하는데요 A = { id: 1, Bs: [ { id : 1, Cs : [ { id: 1 } ] } ] } oneToMany를 조인 하게 되면, SQL은 many의 row를 반환하게 되면서, A객체가 B의 갯수만큼 반환 되게 됩니다. group by등을 통해 해결 하려 했을 때는, oneToMany 컬렉션들이 모두 불러와지지 않는것을 확인 하였고, group by를 활용 하지 않고, 모든 row를 불러와서 aggregate하는 방식으로 코드를 구현 했습니다. 매번 쿼리문을 작성할 때 마다 aggregate하는 코드를 작성하는 것은 옳지 않을 것 같아, 혹시 더 나은 방법이 있을지 문의 드립니다. 혹시 중첩 쿼리를 join 으로 모두 찾아 객체에서 맵핑하려는 시도가 bad practice라면 쿼리 숫자가 늘어나더라도, findByAId, findByBId 등의 방식으로 여러번 쿼리를 하고, 중간에 캐시 레이어를 두는것이 더 나을지도 궁금 합니다. 항상 좋은 강의 감사합니다 :)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 만약 allocationSize = 50 으로 잡고 애플리케이션을 올렸는데요 값자기 그 id(pk) 값이 1~2 올라가다가 서버가 다운되서 다시 올리면 53인가 부터 시작이잖아요? 그럼 2~52 까지의 pk 값은 안쓰고 계속 올라가는게 맞을까요? 실무에서 궁금합니다.
안녕하세요. 위 파일은 product.entity.ts 파일입니다. product.entity.ts 파일에서 @JoinColumn() 을 productSaleslocation 테이블에만 해주시는 이유가 무엇인지 알 수 있을까요? product테이블과 서로 관계를 맺고 있는 productSaleslocation 테이블과 users 테이블에도 @JoinColumn()을 해줘야 하는 것 아닌가요? 상품테이블은 productCategory테이블과(상품카테고리_id)ManyToOne 관계를 맺고 있으며, User 테이블과 (유저_id) ManyToOne 관계를 맺고 있어서 각각 JoinColumn을 해줘야 하는 것으로 생각했는데, 제 생각이 틀린 것일까요? 좋은 강의 해주셔서 진심으로 감사합니다!
안녕하세요. 좋은 강의 감사합니다. entity 구현 1:1 강의에서 npm i 후 package: '@angular-devkit/core@15.1.4', Unsupported engine 이라고 나오는데, 이렇게 터미널에 찍히는 이유가 무엇인가요? 계속 사용할 경우 어떤 문제가 발생하나요? npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@angular-devkit/core@15.1.4', npm WARN EBADENGINE required: { npm WARN EBADENGINE node: '^14.20.0 || ^16.13.0 || >=18.10.0', npm WARN EBADENGINE npm: '^6.11.0 || ^7.5.6 || >=8.0.0', npm WARN EBADENGINE yarn: '>= 1.13.0' npm WARN EBADENGINE }, npm WARN EBADENGINE current: { node: 'v16.12.0', npm: '8.1.0' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@angular-devkit/schematics@15.1.4', npm WARN EBADENGINE required: { npm WARN EBADENGINE node: '^14.20.0 || ^16.13.0 || >=18.10.0', npm WARN EBADENGINE npm: '^6.11.0 || ^7.5.6 || >=8.0.0', npm WARN EBADENGINE yarn: '>= 1.13.0' npm WARN EBADENGINE }, npm WARN EBADENGINE current: { node: 'v16.12.0', npm: '8.1.0' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@angular-devkit/schematics-cli@15.1.4', npm WARN EBADENGINE required: { npm WARN EBADENGINE node: '^14.20.0 || ^16.13.0 || >=18.10.0', npm WARN EBADENGINE npm: '^6.11.0 || ^7.5.6 || >=8.0.0', npm WARN EBADENGINE yarn: '>= 1.13.0' npm WARN EBADENGINE }, npm WARN EBADENGINE current: { node: 'v16.12.0', npm: '8.1.0' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@angular-devkit/core@15.0.4', npm WARN EBADENGINE required: { npm WARN EBADENGINE node: '^14.20.0 || ^16.13.0 || >=18.10.0', npm WARN EBADENGINE npm: '^6.11.0 || ^7.5.6 || >=8.0.0', npm WARN EBADENGINE yarn: '>= 1.13.0' npm WARN EBADENGINE }, npm WARN EBADENGINE current: { node: 'v16.12.0', npm: '8.1.0' } npm WARN EBADENGINE } npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: '@angular-devkit/schematics@15.0.4', npm WARN EBADENGINE required: { npm WARN EBADENGINE node: '^14.20.0 || ^16.13.0 || >=18.10.0', npm WARN EBADENGINE npm: '^6.11.0 || ^7.5.6 || >=8.0.0', npm WARN EBADENGINE yarn: '>= 1.13.0' npm WARN EBADENGINE }, npm WARN EBADENGINE current: { node: 'v16.12.0', npm: '8.1.0' } npm WARN EBADENGINE } npm WARN deprecated apollo-datasource@3.3.2: The `apollo-datasource` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. npm WARN deprecated apollo-server-errors@3.3.1: The `apollo-server-errors` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. npm WARN deprecated apollo-server-plugin-base@3.7.1: The `apollo-server-plugin-base` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. npm WARN deprecated apollo-server-types@3.7.1: The `apollo-server-types` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. npm WARN deprecated sourcemap-codec@1.4.8: Please use @jridgewell/sourcemap-codec instead npm WARN deprecated apollo-server-express@3.11.1: The `apollo-server-express` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. npm WARN deprecated apollo-reporting-protobuf@3.3.3: The `apollo-reporting-protobuf` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/usage-reporting-protobuf` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. npm WARN deprecated apollo-server-env@4.2.1: The `apollo-server-env` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/utils.fetcher` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. npm WARN deprecated subscriptions-transport-ws@0.11.0: The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md npm WARN deprecated apollo-server-core@3.11.1: The `apollo-server-core` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details. added 806 packages, and audited 807 packages in 21s 98 packages are looking for funding run `npm fund` for details found 0 vulnerabilities
아래 질문과 동일한 에러가 발생해서 알려주신 해결책으로 진행했는데...이번에는 다른 문제가 발생했습니다. Error: Access denied for user 'root'@' localhost ' (using password: YES) 구글링으로 아무리 찾아서 해보아도 해결이 안되고 있습니다. 아래 테이블 만들었구요 권한문제인가 싶어서 user 테이블의 root 의 authentication_string 을 바꿔도 해쉬값으로 저장되지도 않고...현재는 NULL로 해놓고 있는데 도무지 해결이 되지 않습니다. 도와주세요 ㅠㅠ
yarn seed를 통해 더미데이터를 생성하려 했으나 "seeder is not a constructor" 라는 에러에 마주칩니다. 어느 부분이 잘못됫는지 알아보기 위해 에러코드를 살펴봤으나 제 코드 부분이 아닌 typeorm-extension 부분에서 에러가 나는것 같아 해결하기 어렵습니다. TypeError: seeder is not a constructor at /Users/jinyoung/Desktop/try-own-version/practice-version/node_modules/typeorm-extension/src/seeder/module.ts:122:19 at Generator.next (<anonymous>) at fulfilled (/Users/jinyoung/Desktop/try-own-version/practice-version/node_modules/typeorm-extension/dist/seeder/module.js:5:58) dataSource.ts import dotenv from 'dotenv'; //dataSource에 entity를 입력해줄때는 절대경로면 못찾아온다. 그래서 상대 경로로 써줘야함 import { User } from './src/users/entities/user.entity'; import { DataSource } from 'typeorm'; const mode = process.env.NODE_ENV || 'development'; dotenv.config({ path: process.cwd() + `/.env.${mode}` }); const dataSource = new DataSource({ type: 'mysql', host: 'localhost', port: 3306, database: process.env.DB_DATABASE, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, charset: 'utf8mb4_general_ci', entities: [User], migrations: [__dirname + '/src/migrations/*.ts'], synchronize: true, logging: true, }); export default dataSource; package.json seed부분 설정 "seed": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js seed -d ./dataSource.ts" database/seeds/create-initial-data.ts import { User } from '../../users/entities/user.entity'; import { DataSource } from 'typeorm'; import { Seeder, SeederFactoryManager } from 'typeorm-extension'; export class UserSeeder implements Seeder { async run( dataSource: DataSource, factoryManager: SeederFactoryManager, ): Promise<any> { const userRepository = dataSource.getRepository(User); await userRepository.save({ email: 'ggg@gmail.com', firstName: 'sfvs', lastName: 'wdwdwd', nickname: 'hihi', }); } } typeorm-extension 버젼 "typeorm-extension": "^2.4.2", "typeorm": "^0.3.12", 시도해본 내용 1. dataSource 생성시 new DataSource({ ... 중략 seed:["create-initial-data.ts 경로"] 추가 }) 2. db 삭제후 다시 생성(생성시 테이블 싱크까지 맞춘후 seed 시도) 3. typeorm-extension 버전 문제일까 해서 다운그레이드 시도 4. typeorm 0.3대는 유지하고 0.3.11, 0.3.10등 다른 버전으로 시도 결과 모두 실패
안녕하세요. 영한님 20만 수강생 진심으로 축하드립니다.^^🎉 프로젝트 도중에 막혀서 강의를 👀복습하던 중 질문드립니다..! (영한님 강의 덕분에 저도 이러한 고민을 하게되다니... 감사의 말씀 드립니다.😊) 페이징이 가능하고 item.name 으로 order 를 조회하려고 하면 어떠한 방식으로 코드를 작성 해야할까요? 일단 제가 생각한 방법은 다음과 같습니다. V3.1 적용 요구사항은 회원( member ), 결제( payment ), 배송( delievery ), 주문 상품( orderItem )을 포함해서 페이징이 되도록 주문( order )을 조회하고, 조건으로 상품 이름( item.name )으로 조회가 가능 해야 하는 것 입니다. orderItem 은 일대다 관계 이기 때문에 페이징이 불가합니다. 그래서 V3.1의 방법인 hibernate.default_batch_fetch_size 을 이용하여 IN 쿼리로 orderItem 을 조회하려고 합니다. 이렇게 하면 페이징이 가능하도록 order 는 조회할수는 있지만, item.name 을 조건으로 조회 할 수는 없습니다. V5 적용 그래서 V5에서 알려주신 방법을 사용했습니다. order 와 orderItem 을 분리한다. order 을 이용하여 orderItem 을 조회한다.(추가로 item.name 조건도 넣는다.) 조회한 결과를 하나의 List 으로 만든다. List 을 다시 Page 로 변환한다. public Page<AdminOrderListQueryDto> findOrdersByAdmin(Pageable pageable, OrderSearchCondition condition) { // 주문 전체 조회 List<AdminOrderListQueryDto> content = queryFactory .select(new QAdminOrderListQueryDto(order.id, order.status.stringValue(), order.safeKingPayment.amount, order.createDate, order.merchantUid, new QAdminOrderListPaymentQueryDto(order.safeKingPayment.status.stringValue()), new QAdminOrderListMemberQueryDto(order.member.name), new QAdminOrderListDeliveryQueryDto(order.delivery.receiver, order.delivery.status.stringValue())) ) .from(order) .leftJoin(order.safeKingPayment, safekingPayment) .leftJoin(order.delivery, delivery) .leftJoin(order.member, member) .where( orderBetweenDate(condition.getFromDate(), condition.getToDate()), deliveryStatusEq(condition.getDeliveryStatus()), paymentStatusEq(condition.getPaymentStatus()) ) .orderBy(order.createDate.desc()) .fetch(); // 주문 아이디 저장 List<Long> orderIds = content.stream() .map(o -> o.getId()) .collect(Collectors.toList()); // 상품명으로 검색 조건 Map<Long, List<AdminOrderListOrderItemQueryDto>> orderItemMap = findOrderItemMap(orderIds, condition.getKeyword()); // 주문객체에 주문 상품컬렉션 저장 content.forEach(o -> o.setOrderItems(orderItemMap.get(o.getId()))); // 주문상품이 null이 아닌 컬렌션으로 구성 List<AdminOrderListQueryDto> resultContent = content.stream() .filter(o -> o.getOrderItems() != null) .collect(Collectors.toList()); // List를 Page로 변환 PageRequest pageRequest = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize()); int start = (int) pageRequest.getOffset(); int end = Math.min(start + pageRequest.getPageSize(), resultContent.size()); if(start > end) { throw new OrderException("데이터가 없습니다. 관리자에게 문의하세요."); } return new PageImpl<>(resultContent.subList(start, end), pageRequest, resultContent.size()); } private Map<Long, List<AdminOrderListOrderItemQueryDto>> findOrderItemMap(List<Long> orderIds, String keyword) { // 주문 상품 검색(item.name 조건 포함) List<AdminOrderListOrderItemQueryDto> orderItems = queryFactory.select(new QAdminOrderListOrderItemQueryDto(orderItem.order.id, orderItem.id, orderItem.item.name)) .from(orderItem) .leftJoin(orderItem.item, item) .where( orderItem.order.id.in(orderIds), keywordContains(keyword) ) .fetch(); // Map 으로 변환 Map<Long, List<AdminOrderListOrderItemQueryDto>> orderItemMap = orderItems.stream() .collect(Collectors.groupingBy(orderItemQueryDto -> orderItemQueryDto.getOrderId())); return orderItemMap; } // 아이템이름 포함 조건 private BooleanExpression keywordContains(String keyword) { return hasText(keyword) ? item.name.contains(keyword) : null; } 이러한 방식을 사용하는게 맞을까요? 🤔 감사합니다.^^
const savedProductSaleslocation = await this.productSaleslocationRepository.save({ ...productSaleslocation, }); 위 코드에서, 아래처럼 코드를 바꿔봤습니다. const savedProductSaleslocation = await this.productSaleslocationRepository.save(productSaleslocation); 정상 작동했는데 차이가 무엇인가요? 또 권장하는 방식은 무엇인가요?
안녕하세요. 오늘도 질문을 남기러 왔습니다. 자주 올려서 죄송합니다ㅠ 저는 이제 국비지원학원에서 JSP + SERVLET을 기반으로하는 팀 프로젝트를 마치고 스프링 강의에 들어갑니다. 학원 강의를 따라가기 위해, 김영한 강사님의 스프링 입문, 스프링 핵심 원리(기본편) 강의로 스프링을 예습을 해둔 상태입니다. 원래대로라면 다음 강의로 스프링 MVC 1편을 들을 예정이었지만, 강사님 조언에 따라서 야생형 코스를 밟고자합니다! 저 같은 상황이라면 바로 JPA 활용 1편으로 넘어가면 되는게 맞을까요? 학원 커리큘럼이 mybatis 기반이라 JPA를 선행학습하는게 맞나 고민이 생겨서 질문 드립니다 ㅠㅠ...
int i = Integer.parseInt("93"); System.out.println(i); int i = Integer.valueOf("93"); System.out.println(i); 두 개다 93으로 출력이 되는데 둘 다 맞는 문법인가요? 문자를 정수로 바꿔준다는 기능은 똑같은거 같은데.. 차이가 뭔지 잘 모르겠습니다..
제가 사용중인 우분투 버젼입니다. 몽고 디비 설치를 노션 자료에 있는대로도 설치를 해보고, 삭제하고 공식문서에 있는대로도 설치를 해봤는데 (노션에는 공개키가 server-5.0 으로 되어있고 공식 문서는 server-6.0 으로 되어있더라구요) 설치 후에 실행을 해보면 [fail] 이 뜨면서 실행이 되지 않네요. 구글링해서 여러가지 방법 따라해봐도 계속 fail 이어서 질문글 올립니다. 추가로 이상한 점은 mongod --version 이라고 치면 버전이 나오는게 아니라 Illegal instruction 라고 나옵니다. ++구글에 mongod --version Illegal instruction 라는 키워드로 검색을 해서 https://info-orgs.blogspot.com/2021/10/how-to-install-mongodb-v44-mongodb.html 이 글을 보고 몽고 디비 4.4 버전을 설치해봤는데 mongod --version 이라고 치면 이제 버전이 나오긴 하는데 여전히 실행은 실패하네요. $ service mongod start * Starting database mongod /etc/init.d/mongod: 136: ulimit: error setting limit (Operation not permitted) /etc/init.d/mongod: 142: ulimit: error setting limit (Operation not permitted) start-stop-daemon: start-stop-daemon: unable to open pidfile '/var/run/mongod.pid' for writingunable to set gid to 121 (Permission denied) (Operation not permitted) start-stop-daemon: child returned error exit status 2
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요 강의 잘 듣고 있습니다. 강의를 듣다 질문이 있어서 글 남깁니다! profiles 설정을 할때 인텔리제이 무료 버전이라 add vm options 를 -Dspring.profiles.active=local 로 설정하면 local로 설정할 수 있다고해서 이런식으로 일단 profiles를 local로 설정했는데 홈페이지 실행 후 접속하니 mysql에서의 정보가 그대로 남아있습니다. local설정을 잘 했는데 h2에 연결이 안되는거 같은데 원인이 무었일까요? 그리고 h2사이트에 접속해 강의 내용대로 connect를 하니 접속이 안됩니다...
실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요 코틀린강의부터 코프링까지 잘 듣고 있습니다. 바로 질문 드리자면,! 1.saveUserTest2라는 테스트케이스를 한 개 더 만들어서 모든 테스트를 진행 시킨다면, saveUserTest는 통과하지만 saveUserTest2는 DB데이터가 2개 가 있어서 통과되지 못 합니다. 이럴 때는 어떻게 해야 독립적으로 DB값을 가지게 할 수 있나요? @Transactional 쓰는 rollback된다고 얼핏 들은 거 같은데 잘 모르겠네요.. 2.실제 h2 DB에는 유저가 2명이 저장이 되어 있는데 테스트환경에서는 0명인 이유는 @SpringBootTest 어노테이션이 실제 실행환경과 완전히 독립된 환경을 만들어 주어서 그런 건가요? 감사드립니다.
안녕하세요 선생님 강의 잘 듣고 있습니다 Authorization Code 요청하기 강의를 듣고 궁금한점이 생겨서 질문 올립니다 이번 강의의 핵심은 임시코드 발급하기 였습니다 클라이언트가 keyCloak 와 연동해서 어떻게 redirect uri 를 만들고 어떻게 요청을 하고 인증이 완료 되는것도 같이 해보았습니다 다만 저는 좀 궁금한게 선생님이 총 2개의 로그인 방식을 보여주셨다고 생각합니다 이 링크를 클릭했을때의 방식 다른 방식은 세션을 완전히 제거한 이 화면에서 로그인 하는 방식을 보여주셨습니다 여기선 궁금한건 이번강의 주제는 임시코드를 발급받는 Filter 에 대해서 공부중인데 첫번째 스크린샷에서는 선생님이 말씀하신 대로 OAuth2AuthorizationRequestRedirectFilter 에서 잘 요청이 들어옵니다 requset 가 "/oauth2/authorization"; 들어오기 떄문인데 두번쨰 스크린샷에서는 전혀 이 필터를 태우지 않습니다 저는 임시코드 발급이라고 하길래 지금 할려는 스크린샷 1 , 2 두 행동 모두가 임시코드를 발급받기 위한 행동으로 알고 있습니다 그런데 첫번째 스크린샷은 OAuth2AuthorizationRequestRedirectFilter 필터를 태우고 두번째 스크린샷은 OAuth2LoginAuthenticationFilter 이 필터를 태우고 있습니다 이 앞의 configure 강의에서도 요청 순서 말씀하시면서 OAuth2AuthorizationRequestRedirectFilter 가 먼저 요청을 받아서 임시코드를 받아오고 그 다음 OAuth2LoginAuthenticationFilter 가 진행된다 라고 하셔서 제가 지금 혼동이 오는거 같습니다. 앞의 부분에서 제가 놓친 부분이 있을까요 선생님?
네트워크 소스 확인해보니, 같은 강의에서 수행된 Swagger에서 사용한 Header(Authorization)이 살아있고 이를 이용해 로그인 시도하는 것을 확인했습니다. swagger 로그인을 수행하신 분들은 기존 쿠키 삭제하고 다시 시도하시면 정상 로그인 됩니다. 안녕하세요 고양이 프로젝트 로그인 API 연결이 잘 안되어 질문드립니다. 포스트맨에서는 로그인이 정상적으로 수행됩니다. 그런데 프론트에서 로그인을 수행하면 다음과 같이 Unauthorized 에러가 발생합니다. 비밀번호를 다르게 입력해보니 이메일과 비밀번호를 확인하라는 에러가 뜨는걸로 봐서 뭔가 다른 문제가 있는것 같습니다. 아마 프론트 문제인것같은데 어떻게 해결해야할지 모르겠습니다... 도움주시면 감사하겠습니다.
윈도우 환경에서 yarn 이 에러가 나서 npm으로 진행중입니다~ "npm yarn 은 성능만 차이가 나고 명령어는 똑같다" 라고 알고 있는데, 명령어도 다른건가 라는 의문이 들어 질문 드립니다. npm의 경우는 pakage.js 에 아래와 같이 작성 후 npm aaa 로는 실행이 안되고, npm run aaa 로 만 실행이 되는데, yarn aaa 는 실행이 잘 되는듯 하네요 왜 그런 걸까요? run 이 생략된 걸까요? 웹펙 쪽을 먼저 학습하고 가야 할지... 수업 들으면서 모르는걸 다 질문드려도 될까요? package.json script:{ "aaa":"nodemon app.js" }