묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
섹션22 서버개념에 대한 질문입니다.
안녕하세요? 강의 잘 듣고 있습니다.서버관련해서 몇가지 헷갈리는 개념이 있어서 질문드립니다. 서버가 백엔드만 지칭하는 용어인 줄 알았는데 프론트나 DB에도 서버개념이 있다는 것이 신기했습니다. 단순히 데이터를 제공하는 입장이면 전부 서버라는 용어를 사용해도 되는 것인가요?브라우저와 클라이언트를 같은 개념으로 생각해도 되는지요? 더 나아가 프론트까지? (저는 백엔드 개발을 공부하고 있어서 백엔드입장에서는 브라우저, 클라이언트, 프론트가 전부 같은 포지션으로 생각됩니다.)백엔드서버가 브라우저의 접속도 기다린다고 하셨는데 백엔드서버는 프론트엔드서버하고만 통신하는 것이 아닌가요?예를들어 브라우저(클라이언트?)에서 회원가입창을 클릭하고 프론트서버에서 화면을 보여줍니다.그리고 휴대폰인증번호를 입력한다고 하면, 프론트서버가 그 번호을 받아 백엔드서버로 넘겨줘서 백엔드에서 검증뒤 프론트로 보내주고, 프론트는 인증결과를 브라우저에 표시해줍니다.보통 이런 경우 백엔드는 브라우저가 아니라 프론트하고 교류를 하는 것이 아닌가 생각합니다. 근본적으로 궁금한 것은 클라이언트가 브라우저에서 이런 저런 작업(클릭, 입력)을 했을 때 브라우저, 프론트, 백엔드, DB에서 서로 어떻게 통신을 하는지 내부에서 어떤 작업들이 일어나는지등의 큰 흐름을 알고 싶은데 이건 지금 질문하기보단 강의를 끝까지 들어봐야될것 같네요 ^^;;
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
모듈 의존성 문제
@Module({ imports: [ TypeOrmModule.forFeature([Product, ProductTag, ProductCategory]), UserModule, ProductTagModule, ProductCategoryModule, ], providers: [ ProductResolver, ProductService, ], }) export class ProductModule {}위와 같은 코드에서 ProductService의 실행에 필요한 ProductTagModule과 ProductCategoryModule를 다 import 해주었는데 계속 아래와 같은 의존성 오류가 나왔습니다.Nest can't resolve dependencies of the ProductService (ProductRepository, ?, UserService, ProductCategoryService). Please make sure that the argument ProductTagService at index [1] is available in the ProductModule context.Potential solutions:- Is ProductModule a valid NestJS module?- If ProductTagService is a provider, is it part of the current ProductModule?- If ProductTagService is exported from a separate @Module, is that module imported within ProductModule? @Module({ imports: [ /* the Module containing ProductTagService */ ] }) 그래서 아래와 같이 ProductTagService, ProductCategoryService를 임의로 providers에 넣어주면 또 실행이 됩니다. 해당 모듈을 이미 임포트 해주었는데 왜 서비스를 따로 또 주입해주어야 할까요?@Module({ imports: [ TypeOrmModule.forFeature([Product, ProductTag, ProductCategory]), UserModule, ProductTagModule, ProductCategoryModule, ], providers: [ ProductResolver, ProductService, ProductTagService, ProductCategoryService, ], }) export class ProductModule {} 아래는 ProductTagModule과 ProductCategoryModule 코드입니다.@Module({ imports: [TypeOrmModule.forFeature([ProductTag])], providers: [ProductTagResolver, ProductTagService], }) export class ProductTagModule {} @Module({ imports: [TypeOrmModule.forFeature([ProductCategory])], providers: [ProductsCategoriesResolver, ProductCategoryService], }) export class ProductCategoryModule {}
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
15-02 API-GateWay 2
안녕하세요 수업을 잘 따라가고 있던 중 오류가 발생하였습니다... docker을 작동 하였고 아래와 같이 나와 도커를 확인 하였습니다.gatway제외한 나머지는 작동이 되는 걸 확인 하였고 gateway만 따로 작동을 하자 아래와 같이 에러가 발생하였습니다... 버전문제 때문에 그런건가요...??
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
git 배포!!!!!!
동일한 질문이 있는데 답변을 이해하지 못해서 질문합니다. 저는 [깃허브아이디]/상위폴더/하위폴더/하위폴더2 에 지금까지 만든 넷플릭스 파일들이 있습니다.이 경우에 package.json의 homepage 부분과 index.js의 basename은 어떻게 설정해야 하는 것인지요? 아까까지 전체 주소(하위폴더2까지) homepage, basename을 작성하여 배포했는데 완성된 주소는 상위폴더까지만 적혀 있습니다.지금은 [깃허브아이디].github.io/[상위폴더]/로 다시 배포했는데 상위폴더 안의 Read.me만 나오고 있습니다. (캐시 삭제 및 20분 정도 기다림)ㅠㅠ 왜 이러는지 알고 싶습니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
안녕하세요 버전1과 버전2의 차이에서
cs적인 부분이 더 강화되고 장점이 더 많아 졌다는 것을 알게되었는데,혹시 ver1부분과 ver2부분에서 elk스택에 대해서는 없는거 같은데 빠졌나요?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
배너 Iframe 디자인 시 가상 요소
여기서 &를 써서 스타일을 추가하는 이유가 무엇인가요?그냥 위에 있는 Iframe에 적용하면 안되는 건가요?이 부분을 Iframe에 포함시키니 오류가 나서 왜인지 궁금합니다.const Iframe = styled.iframe` width: 100%; height: 100%; z-index: -1; opacity: 0.65; border: none; &: :after { content: ""; position: absolute; top: 0; left: 0; width: 100% height: 100% } `;
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
수업과는 상관없지만 개발 순서와 완성도에 대해 질문드립니다!
안녕하세요!저는 프론트수업과 백엔드 수업을 듣고 하나의 웹을 혼자서 만들어보려고 하는데요.프론트부분과 백엔드 부분 중 어느 부분을 먼저 만들어야하는지 궁금합니다.그리고 백엔드 개발자를 준비한다면 프론트 부분의 완성도가 어느정도여야 하는지도 궁금합니다.( 포트폴리오 제출시 어필하기 위해서 )질문이 많이 모호해서 답변해주시기 어려울 것 같다는 생각이 드는데요, 혼자서 포트폴리오를 위해 웹을 제작하는 경우 어느정도까지 완성해야하는지가 궁금합니다.
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
axios 401 오류
axios 코드입니다.import axios from "axios"; const instance = axios.create({ baseURL: "https://api.themoviedb.org/3", params: { api_key: "895e2a24f997d16a2490bcfddde450c28", language: "ko-kr", }, }); export default instance;requests 코드입니다.const requests = { fetchNowPlaying: "movie/now_playing", fetchNetflixOriginals: "/discover/tv?with_networks=213", fetchTrending: "/trending/all/week", fetchTopRated: "/movie/top_rated", fetchActionMoives: "/discover/movie?with_genres=28", fetchComedyMovies: "/discover/movies?with_genres=35", fetchHorrorMovies: "/discover/movies?with_genres=27", fetchRomanceMovies: "/discover/movies?with_genres=10749", fetchDocumentarues: "/discover/movies?with_genres=99", }; export default requests; App 코드입니다.import "./App.css"; import Nav from "./components/Nav"; import Banner from "./components/Banner"; function App() { return ( <div className="App"> <Nav /> <Banner /> </div> ); } export default App; Banner 코드입니다.import axios from "../api/axios"; import React, { useState, useEffect } from "react"; import requests from "../api/requests"; 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 results = await axios.get(`movie/${movieId}`, { params: { append_to_response: "videos" }, }); console.log("results", results); console.log(movieId); }; return <div></div>; } export default Banner; 확인해봤을 때는 틀린 부분이 없는데 아래와 같은 오류가 발생합니다. ㅠㅠ 어디 잘못 작성한 게 있을까요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
마이바티스와 테스트 코드
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요.안녕하세요 강사님 강의 너무 잘 듣고있습니다. 회사에서 Mybatis로 개발 중인데 테스트 코드 작성에 어려움이 있어 질문 드립니다. JPA의 경우 CRUD가 기본적으로 구현되어 있지만, Mybatis의 경우 xml(또는 인터페이스)에 정의된 메서드를 사용하기 때문에 테스트 코드 작성이 어렵더군요.. 만약 Money 테이블이 있고, 해당 Repository에 Select 코드가 없는 경우 어떻게 검증을 해야 좋을까요? 테스트를 위해 xml이나 인터페이스에 새로운 코드를 작성하는 것은 좋은 방법이 아닌 것 같고, Jdbc Template를 이용해봤는데 이 경우에는 데이터가 롤백되지 않는 등의 문제가 있었습니다.( 아마 잘못 사용해서 그런 것 같기도 합니다..) Repository 부분을 Mock으로 Stub하여 테스트를 진행하는 것도 생각해 보았습니다. 이 경우에는 Repository 쿼리를 수정할 때마다 Service에 정의된 Stub도 그에 맞게 계속 수정해야 하는 문제가 있어서 이 방법도 적합하지 않다고 생각이 들었습니다..(이 케이스도 A,B 각각 모듈 단위의 테스트는 성공하나 결합하여 테스트할 때 실패하는 경우라고 볼 수 있을까요?) 회사가 테스트 코드를 작성하는 문화는 아니어서 물어볼 사람이 없어 질문 남깁니다.. 좋은 강의 감사하합니다. 앞으로도 좋은 강의 기대하겠습니다!!
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
ProductService의 updateProduct 로직 질문입니다.
updateProduct 로직을 보면, 맨 첫줄에productPort.getProduct로 조회를 해온 뒤 product.update(~~~)로 변경을 하면, 변경 감지가 일어날텐데굳이 save를 호출하신 이유가 뭐에용??
-
해결됨Practical Testing: 실용적인 테스트 가이드
도메인 테스트 코드 작성을 해봤습니다.
도메인//Order 도메인 @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor public class Order { @Enumerated(EnumType.STRING) private OrderStatus status; @OneToMany(mappedBy = "order",cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); /* 주문 취소 */ public void cancel(){ this.setStatus(OrderStatus.CANCEL); /** 재고 원복 */ for (OrderItem orderItem : orderItems) { orderItem.cancel(); } } }//OrderItem public class OrderItem { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; public void cancel() { getItem().addStock(count); // 재고수량을 늘려준다. } }//Item public class Item { private int stockQuantity; public void addStock(int quantity) { this.stockQuantity += quantity; } }불필요한 코드는 제거 했습니다. 테스트 코드@DisplayName("주문을 생성하고, 주문 취소시 주문 취소로 상태를 변경하고, 감소된 상품 재고를 수량을 추가한다.") @Test void cancelOrder(){ //given OrderItem orderItemMock1 = Mockito.mock(OrderItem.class); OrderItem orderItemMock2 = Mockito.mock(OrderItem.class); BDDMockito.doNothing().when(orderItemMock1).cancel(); BDDMockito.doNothing().when(orderItemMock2).cancel(); //OrderItem 가변인자는 내부에서 List로 보관 Order order = Order.createOrder(orderItemMock1,orderItemMock2); //when order.cancel(); //then assertThat(order.getStatus()).isEqualByComparingTo(OrderStatus.CANCEL); Mockito.verify(orderItemMock1,Mockito.times(1)).cancel(); Mockito.verify(orderItemMock2,Mockito.times(1)).cancel(); }Order 도메인의 cancel()을 테스트 코드를 작성해야한다고 할때cancel 호출로 변경된 상태(enum)와내부 List<OrderItem> 필드에 하나씩 취소 요청을 할때Mock으로 OrderItem 도메인을 만들고 호출을 했는지만 검사를 했습니다. Mock 객체를 만드니까 간단한 단위테스트 인데도 속도가 많이 느려지더라구요이런 경우에Order.cancle 로직에 대한 테스트이기 때문에 나머지는 Mock으로 처리관련된 OrderItem.cancle(),Item.addStock()은 별도 단위테스트로 검증했기때문에추가 검증이 필요없다.Order.cancle 로직에 대한 테스트이지만,OrderItem.cancle(),Item.addStock() 테스트 검증이 끝났다고 해도비즈니스 계층 통합테스트 느낌으로 given에서 데이터를 준비하고연관된 데이터를 전부 검증한다. 1번으로 할경우 테스트 목적은 한눈에 들어오지만2번으로 할경우 이 로직이 어디까지 관련이 되어있는지 테스트 코드로 알수 있을거같아서강사님이 말씀하신 테스트를 문서처럼 사용할 수 있는거같습니다. 고민을 해보니 Order.cancel()은 서비스 계층에서 호출을 할텐데1번으로 테스트를 하고, 서비스 계층에서 통합 테스트를 하는게 맞을까요?더 나은 방법이 있을까요?
-
미해결Practical Testing: 실용적인 테스트 가이드
Persistence Layer(2) 강의 질문있습니다.
안녕하세요.Persistence Layer(2) 강의를 수강 중에 질문이 있습니다.먼저, 저는 h2 database 대신 mysql을 사용하기로 해서, 아래와 같이 application.yml 파일을 작성했습니다.그리고 build.gradle에 mysql import 부분 역시 등록하였습니다.spring: profiles: default: local datasource: url: jdbc:mysql://localhost:3306/testing?useSSL=false&characterEncoding=UTF-8 username: root password: [생략] driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: none sql: init: mode: always --- spring: config: activate: on-profile: local jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true defer-datasource-initialization: true # (2.5~) Hibernate 초기화 이후 data.sql 실행 # h2: # console: # enabled: true --- spring: config: activate: on-profile: test jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true sql: init: mode: never 그리고 ProductRepositoryTest를 실행한 결과, @SpringBootTest 어노테이션 상에서는 테스트가 정상적으로 작동이 되나, @DataJpaTest를 사용하면 아래와 같은 오류가 발생합니다.Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase.Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase. 제 생각에는, application.yml 파일 설정에서 제가 잘못 하고 있는 것 같은데요, 혹시 어느 부분을 제가 놓치고 있는지 알고 싶습니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
코드 오류 (06-03)
06-03 클래스 전략 패턴수업에서 선생님과 코드를 똑같이 입력했는데 오류(공중 몬스터 not defined)가 납니다. 어떤 부분이 문제일까요? class 공중부품 { run = () => { console.log("날아서 도망가자!!"); } } class 지상부품 { run = () => { console.log("뛰어서 도망가자!!"); } } class Monster { power = 10; 부품; constructor(qqq){ this.부품 = qqq; } attack = () => { console.log("공격하자!!"); console.log("내 공격력은" + this.power + "야!!!"); }; run = () => { this.부품.run();class 공중부품 { run = () => { console.log("날아서 도망가자!!"); } } class 지상부품 { run = () => { console.log("뛰어서 도망가자!!"); } } class Monster { power = 10; 부품; constructor(qqq){ this.부품 = qqq; } attack = () => { console.log("공격하자!!"); console.log("내 공격력은" + this.power + "야!! }; } const mymonster1 = new Monster(new 공중부품()); mymonster1.attack(); mymonster1.run(); const mymonster2 = new Monster(new 지상부품()); mymonster2.attack(); mymonster2.run();
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
date를 인식 못하는 문제
엔티티@Entity() @ObjectType() export class Reservation { @PrimaryGeneratedColumn('uuid') @Field(() => String) reservationId: string; @Column({ nullable: false }) @Field(() => Date) startDate: Date; @Column({ nullable: false }) @Field(() => Date) endDate: Date; @Column({ nullable: false }) @Field(() => Int) usersNumber: number; @Column({ nullable: false }) @Field(() => Int) lengthOfStay: number; @Column({ nullable: false }) @Field(() => Int) price: number; @ManyToOne(() => Member) @JoinColumn({ name: 'memberId' }) @Field(() => Member) member: Member; @ManyToOne(() => Campground) @JoinColumn({ name: 'campgroundId' }) @Field(() => Campground) campground: Campground; @ManyToOne(() => Tent) @JoinColumn({ name: 'tentId' }) @Field(() => Tent) tent: Tent; @DeleteDateColumn() deletedAt: Date; } 데이터 생성 DTO@InputType() export class CreateReservationInput extends OmitType( Reservation, ['reservationId', 'member', 'campground', 'tent'], InputType, ) { @Field(() => String) memberId: string; @Field(() => String) campgroundId: string; @Field(() => String) tentId: string; } 위 코드에 graphQL 요청시 에러가 발생합니다.mutation { createReservation ( createReservationInput: { startDate: "2023-01-01" endDate: "2023-06-06" usersNumber: 5 lengthOfStay: 10 price: 5 memberId: "lhw3542" campgroundId: "d35d3972-5c07-47d7-94a2-23c784f0a27e" tentId: "3ae33a7c-c898-4b66-b110-02b4f8c96398" } ) { reservationId startDate endDate usersNumber lengthOfStay price member { memberId } campground { campgroundId } tent { tentId } } } Field 'startDate' doesn't have a default value날짜 형식을 읽지 못하는 것 같은데 무엇이 잘못된 걸까요?아래와 같이 DTO에 직접 써줘도 인식을 못하고 있습니다. @Field(() => Date) startDate: Date; @Field(() => Date) endDate: Date;
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
join한 테이블 조회시 컬럼이 겹치는 문제
아래와 같은 코드에서 memberID를 조건으로 데이터를 조회하면 join된 campground와 member 각각에 member 컬럼이 다 있어 조건으로 넣어준 memberId를 어디서 찾아야 하는지 typeORM에서 인식하지 못하는 것 같습니다. 때문에 아래와 같은 에러가 나오는거 같습니다. 어떻게 해결해야 할까요?result = await this.dibsRepository.find({ where: { member: { memberId }, }, relations: ['campground', 'member'], });QueryFailedError: Column 'memberId' in where clause is ambiguous
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
08-05 강의에서 DB 접근이 안되는 현상이 발생합니다.
위와 같은 연결 오류가 발생하고이때 host는 'localhost' 로 입력을 한 상태입니다.app.module.ts 파일 내의 host를 127.0.0.1 로 변경하면 또 정상 작동 합니다.인터넷을 보니까socketPath: '/tmp/mysql.sock' 를 마지막에 넣어주면 또 정상 작동 하는 것 같습니다.도서관과 같은 특수한 네트워크 환경에서 진행해서 그런걸까요?https://cloer.tistory.com/56 자료를 참고했습니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
find가 빈 값을 반환하는 문제
안녕하세요~프로젝트 만들다보니 질문거리가 많아지네요.@Query(() => [Dibs]) fetchDibs( @Args('findDibsInput') findDibsInput: FindDibsInput, ): Promise<Dibs[]> { return this.dibsService.find(findDibsInput); }async find(findDibsInput: FindDibsInput): Promise<Dibs[]> { const { campgroundId, memberId } = findDibsInput; const result = await this.dibsRepository.find({ where: { campground: { campgroundId }, member: { memberId }, }, }); return result; }위 코드에 아래와 같은 graphQL 요청을 하면 아무런 값도 돌아오지 않습니다.query { fetchDibs( findDibsInput: { campgroundId: "845b4bac-e0d9-4d1e-a897-9859275e9948" memberId: "lhw3542" } ) { campground{ campgroundId campName } member { memberId } } }{ "data": { "fetchDibs": [] } }조건식 인식 자체가 제대로 되지 않고 있는거 같은데 또 오류는 안나오네요.어떤 것이 문제일까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
jwt활용한 로그아웃
혹시 로그아웃에 대한 구현은 어떤식으로 해야할까요? header에서 토큰을 제거하는 거 말고 어떤 방식으로 토큰을 무효화 할까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
복합키 설정 관련 질문
안녕하세요.항상 친절하고 상세한 답변 감사합니다.복합키 생성 관련 오류가 있어 질문드립니다.@Entity() @ObjectType() export class Dibs { @ManyToOne(() => Member) @PrimaryColumn() @JoinColumn({ name: 'memberId' }) @Field(() => Member) member: Member; @ManyToOne(() => Campground) @PrimaryColumn() @JoinColumn({ name: 'campgroundId' }) @Field(() => Campground) campground: Campground; @DeleteDateColumn() deletedAt: Date; }위와 같이 member와 campground의 id를 복합키로하여 Dibs라는 테이블을 생성하려고 합니다. 그런데 아래와 같은 오류가 발생했습니다.[Nest] 21844 - 2023. 05. 24. 오전 9:36:44 ERROR [ExceptionHandler] Data type "Member" in "Dibs.member" is not supported by "mysql" database.DataTypeNotSupportedError: Data type "Member" in "Dibs.member" is not supported by "mysql" database.그런데 해당 코드를 아래와 같이 고치면 또 정상작동하게 됩니다.@Entity() @ObjectType() export class Dibs { @ManyToOne(() => Member) @PrimaryColumn() @JoinColumn({ name: 'memberId' }) @Field(() => Member) memberId: Member; @ManyToOne(() => Campground) @PrimaryColumn() @JoinColumn({ name: 'campgroundId' }) @Field(() => Campground) campgroundId: Campground; @DeleteDateColumn() deletedAt: Date; }member -> memberId, campground -> campgroundId 라고 변수명만 바꿨을 뿐인데 정상작동하는 이유를 모르겠네요. member와 campground의 기본키가 각각 memberId와 campgroundId로 설정되어 있긴 합니다. 최종적으로 아래와 같이 구현했습니다.@Entity() @ObjectType() export class Dibs { @ManyToOne(() => Member) @PrimaryColumn() @JoinColumn({ name: 'memberId' }) @Field(() => String) memberId: string; @ManyToOne(() => Campground) @PrimaryColumn() @JoinColumn({ name: 'campgroundId' }) @Field(() => String) campgroundId: string; @DeleteDateColumn() deletedAt: Date; }위 코드도 문제없이 잘 작동합니다. 그런데 애초에 복합키를 설정하는 것이 안 좋은 것일까요? 외래키 두개로 각 레코드들이 고유하게 구분될 수 있기 때문에 따로 기본키를 설정하지 않았는데 기본키를 설정하는게 더 좋은 방법일까요?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
nextjs 폴더구조 다르신분(pages/, styles/ 없는분)
혹시나 모르실분들이 있을거 같아서 남깁니다.영상에 보이는 구조로 받으시려면npx create-next-app@12.1.0 --typescript ./ 로 하면됩니다. 꽤나 당황했네요 ㅎㅎ