inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

176만명의 커뮤니티!! 함께 토론해봐요.

Persistence 계층 단위테스트를 어디까지 하는게 맞을까요?

해결됨

Practical Testing: 실용적인 테스트 가이드

@DisplayName("상품 번호 리스트로 상품목록을 조회하기") @Test void findAllByProductNumberIn(){ //given Product product1 = createProduct("001", 1000); Product product2 = createProduct("002", 3000); Product product3 = createProduct("003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); //when List<Product> findProducts = productRepository.findAllByProductNumberIn(List.of("001", "003")); //then assertThat(findProducts).hasSize(2) .extracting("productNumber","price") .containsExactlyInAnyOrder( tuple("001",1000), tuple("003",5000) ); } 1. 데이터 계층은 유효한 상품 번호 리스트만 넘어왔다는 전제로만 테스트를 해도 충분한가요? 유효하지 않은 상품번호는 검증 로직에서 걸러졌다고 생각하고 테스트를 한다고 생각하면 될까요? @DisplayName("미등록된 상품 번호 리스트로 상품목록을 조회하기") @Test void findAllByProductNumberIn(){ //given Product product1 = createProduct("001", 1000); Product product2 = createProduct("002", 3000); Product product3 = createProduct("003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); //when List<Product> findProducts = productRepository.findAllByProductNumberIn(List.of("004", "005")); //then assertThat(findProducts).hasSize(0); } 2. JpaRepository가 제공하는 기본 save,findAll 등도 개발자가 원하는 데이터가 올바르게 저장 되었는지, 조회가 되었는지 테스트도 실무에서는 작성하시나요 ? 아니면 이미 만들어진 코드이기 때문에 불필요한 테스트 코드라 생각해서 넘어가는지 궁금합니다. @DisplayName("주문 생성시 상품 리스트에서 주문의 총 금액을 계산한다.") @Test void calculrateTotalPrice(){ //given List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); //when Order order = Order.create(products, LocalDateTime.now()); //then assertThat(order.getTotalPrice()).isEqualTo(3000); } private Product createProduct(String productNumber, int price) { return Product.builder() .type(HANDMADE) .productNumber(productNumber) .price(price) .sellingStatus(SELLING) .name("메뉴 이름") .build(); } @DisplayName("주문 생성시 주문 상태는 INIT 이다.") @Test void init(){ //given List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); //when Order order = Order.create(products, LocalDateTime.now()); //then assertThat(order.getOrderStatus()).isEqualByComparingTo(OrderStatus.INIT); } @DisplayName("주문 생성시 등록시간을 기록한다.") @Test void registeredDataTime(){ //given LocalDateTime registeredDateTime = LocalDateTime.now(); List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); //when Order order = Order.create(products, registeredDateTime); //then assertThat(order.getRegisteredDateTime()).isEqualTo(registeredDateTime); } Order.create 테스트 코드를 작성할때엔 각각 필드 초기화를 단위테스트 를 진행했는데, @DisplayName("주문번호 리스트를 받아 주문을 생성한다.") @Test void createOrder(){ LocalDateTime registeredDateTime = LocalDateTime.now(); Product product1 = createProduct(HANDMADE, "001", 1000); Product product2 = createProduct(HANDMADE, "002", 3000); Product product3 = createProduct(HANDMADE, "003", 5000); productRepository.saveAll(List.of(product1, product2, product3)); OrderCreateRequest request = OrderCreateRequest.builder() .productNumbers(List.of("001", "002")) .build(); OrderResponse orderResponse = orderService.createOrder(request, registeredDateTime); assertThat(orderResponse.getId()).isNotNull(); assertThat(orderResponse) .extracting("registeredDateTime","totalPrice") .contains(registeredDateTime,4000); assertThat(orderResponse.getProducts()).hasSize(2) .extracting("productNumber","price") .containsExactlyInAnyOrder( tuple("001",1000), tuple("002",3000) ); } createOrder 테스트 코드는 같이 검사 를 했습니다. 3. 각 초기화를 해주는 정적 매서드를 테스트 코드로 작성을 했는데 Order.create 테스트 코드는 필드마다 분리를 해서 테스트 코드를 작성하고, createOrder 테스트 코드는 같이 검사를 했습니다. 또 강의에는 없지만 ProductResponse.of 정적 메서드로도 초기화를 했는데 따로 분리해서 테스트 코드를 작성하지 않고 OrderServiceTest의 createOrder()에서 같이 테스트 코드에 포함되었습니다. 테스트 코드를 분리하는 경우와 같이 검사하는 경우를 나누는 기준이 있을까요?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
티벳로보 댓글 1 좋아요 1 조회수 941

@JoinColumn() 관련 오류

미해결

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

@JoinColumn() @OneToOne(() => ProductSalesLocation) productSaleslocation: ProductSalesLocation; 코드가 들어가면 import { JoinColumn, JoinTable } from 'typeorm/browser'; 위 처럼 import가 되고 아래와 같은 오류가 뜹니다. Join Column OneToOne 부분만 지우고 코드를 돌리면 잘 돌아가는데, 저것을 추가하는 순간 아래와 같은 오류가 뜹니다. 이유를 알 수 있을까요? 16-01-mysql-relation2/node_modules/typeorm/browser/index.js:3 import "reflect-metadata"; ^^^^^^ SyntaxError: Cannot use import statement outside a module at internalCompileFunction (node:internal/vm:73:18) at wrapSafe (node:internal/modules/cjs/loader:1176:20) at Module._compile (node:internal/modules/cjs/loader:1218:27) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1308:10) at Module.load (node:internal/modules/cjs/loader:1117:32) at Function.Module._load (node:internal/modules/cjs/loader:958:12) at Module.require (node:internal/modules/cjs/loader:1141:19) at require (node:internal/modules/cjs/helpers:110:18) at Object.<anonymous> (/Users/hychoi/WebstormProjects/backend-study/class/16-01-mysql-relation2/src/apis/products/entities/product.entity.ts:3:1) at Module._compile (node:internal/modules/cjs/loader:1254:14)

  • javascript
  • node.js
  • express
  • docker
  • tdd
  • rest-api
  • nestjs
최학열 댓글 1 좋아요 0 조회수 620

tailwind css가 적용이 안돼요

미해결

따라하며 배우는 리액트 A-Z[19버전 반영]

강의 보고 따라했는데 tailwind가 적용이 안되네요 뭐가 문제일까요? Hello world!에 밑줄이 그어져야 하는데 그대로예요. 다른분이 하신 질문보고 거기 답변달린 방법들 해봤는데 계속 해결이 안되네요.. 시도한 방법 tailwind.config.js 파일의 content 확인 터미널에서 pakage.json에 dependencies 최신버전으로 업그레이드하기 App.css 확인 npm run start했던거 껐다가 다시켜기 아래는 해당하는 파일들이예요. App.css에서 [Unknown at rule @tailwindcss (unknownAtRules)] 경고가 떴었어요 이게 문제일까요? 근데 저 오류로 검색해보면 죄다 그냥 경고 무시하기 설정방법만 나오던데 다른 해결방법이 있는건가요? tailwind.config.js /** @type {import('tailwindcss').Config} */ module.exports = { content: ["./src/**/*.{html,js}"], theme: { extend: {}, }, plugins: [], } app.css @tailwind base; @tailwind components; @tailwind utilities; /*아래는 생략*/ app.js import React, {useState} from "react"; import "./App.css"; import List from "./components/List"; import Form from "./components/Form"; export default function App() { const [todoData, setTodoData] = useState([]); const [value, setValue] = useState(""); const handleSubmit = (e) => { e.preventDefault(); let newTodo = { id: Date.now(), title: value, completed: false } setTodoData(prev => [...prev, newTodo]); setValue(""); }; return ( <div className="container"> <div className="todoBlock"> <div className="title"> <h1>할 일 목록</h1> </div> <h1 className="text-3xl font-bold underline"> Hello world! </h1> <List todoData={todoData} setTodoData={setTodoData}/> <Form handleSubmit={handleSubmit} value={value} setValue={setValue} /> </div> </div> ) }

  • react
  • redux
  • tdd
  • typescript
  • next.js
  • 소프트웨어-테스트
Jin Park 댓글 1 좋아요 0 조회수 10247

15-02 API-Gateway2 윈도우는 되는데 도커는 안됩니다

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

저의 개발 환경은 윈도우입니다. 이렇게 코드를 실행하였을 시 로컬 개발환경에서는 잘 실행이 됩니다. 그런데 docker로 실행시켰을 시 gateway만 아래의 오류가 뜹니다. 어떻게 처리 방법이 있을까요?

  • javascript
  • node.js
  • express
  • docker
  • tdd
  • rest-api
  • nestjs
yskim 댓글 1 좋아요 0 조회수 406

상품카테고리 API 실행 후, respository.save() 오류

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

안녕하세요. 부트캠프 백엔드 강의를 수강하고 있습니다. 강의 [섹션8. ORM활용 API구현 > 상품카테고리 등록 API] 에서 질문이 있습니다. ProductCategory 생성 API를 실행하면, ProductCategory의 Metadata가 없다는 오류가 뜹니다 강의자료(노션)의 코드를 그대로 copy&paste 해줘도 동일한 오류가 나옵니다. 상품카테고리 등록 API 통하여 {name} 인수는 제대로 서버에 들어옵니다. (Console.log에 제대로 나와요) 디버깅해보니 아래 코드에서 에러가 발생합니다. const result = await this.productCategoryRepository.save({ name }); => 위 코드를 주석처리하면 오류발생 없이, DB 테이블들이 정상적으로 생성됩니다. {name} 에 인수도 잘 들어오는데, 터미널에서 보면 mysql 쿼리문도 생성이 안됩니다. 제가 어떤 부분에서 수정을 해줘야할까요? 댓글 부탁드립니다~ 좋은강의에 항상 감사드립니다!

  • javascript
  • node.js
  • express
  • docker
  • tdd
  • rest-api
  • nestjs
민유 댓글 1 좋아요 1 조회수 631

TRUNCATE TABLE 시 AUTO_INCREMENT 컬럼 1로 초기화

미해결

실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD

MySQL이나 H2 에서 TRUNCATE TABLE 시 AUTO_INCREMENT 컬럼값도 1로 초기화되는 걸로 알고 있습니다. 그런데 강의에서는 TRUNCATE 후 AUTO_INCREMENT 컬럼인 ID 를 1부터 다시 시작하게 하는 쿼리를 추가하셔서 어떤게 맞는건지 헷갈립니다 좋은 강의 감사합니다

  • tdd
  • spring-boot
  • pojo
  • 소프트웨어-테스트
  • api
pgrrr119 댓글 1 좋아요 2 조회수 3601

며칠 안으로 수강하는게 목표인가요?

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

이 강의는 며칠 안으로 끝내는게 목표인가요?

  • javascript
  • node.js
  • express
  • docker
  • tdd
  • rest-api
  • nestjs
kql 1 댓글 1 좋아요 0 조회수 307

강의를 다 듣고 몇가지 궁금점이 있어요

해결됨

Practical Testing: 실용적인 테스트 가이드

안녕하세요, 강의를 모두 들었고 정말 알차고 재밌게 다 들었습니다. 감사드립니다! 복습을 하다보니 실무 관점에서 몇가지 궁금한 부분들이 있는데요!! 1) JpaRepository 를 구현하는 구현체로 기본적인 CRUD 등 (ex. save(), saveAll() 등) 사용한다면, 이 부분도 별도 테스트를 작성하시나요? 전 이미 제공된 기본 메소드라 테스트 안해도 될 것 같다고 생각드는데 강사님은 실무에서 이부분도 하시는지 궁금합니다. 2) update/delete를 하게되면 저는 보통 void로 리턴값 없이 HttpStatus.ok 코드 정도만 보내곤했는데요. ApiResponse<Void> 이렇게 해서 보내도 무관할지 아니면 처리된 id값 정도라도 응답데이터에 실어서 보내는게 좋은가요? 3) 클라이언트에게 response하고 싶은 데이터가 API마다 다를 수 있는데 그럴때 서로 다른 Response DTO를 각자 만들어서 반환하시는 편인가요?? 제가 질문한 부분들은 할려면 다 할 수 있지만 좀 더 실무적인 관점에서의 방법이 궁금해서 여쭤봅니다! 감사합니다!

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
lina 댓글 1 좋아요 2 조회수 498

grapnql fetchboardscount와 createboard

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

안녕하세요 데이터 통신 실습 중에 질문이 생겨 남깁니다. create board 실행 시 리턴값으로 number를 지정했을 때 나오는 게시물의 수와 fetchboardscount 실행 시 리턴값이 다른 이유가 궁금합니다. createboard의 리턴값도 몇 번째 게시물로 생성된 것인지 알려주므로 둘 다 게시물의 개수를 알려주는 게 아닌가요 ?

  • javascript
  • node.js
  • express
  • docker
  • tdd
  • rest-api
  • nestjs
댓글 1 좋아요 0 조회수 210

서버가 안열려요

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

코드캠프 서버가 안 열려요 실습해야 하는데

  • javascript
  • node.js
  • express
  • docker
  • tdd
  • rest-api
  • nestjs
알렉스 페레이라 댓글 2 좋아요 0 조회수 397

db가 이미 존재한다는 오류가 뜹니다

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

graphql 방식이 아닌 rest로 변경하면서 다시한번 복습중인데 rest의 경우 app.module.ts에서 TypeOrmModule.forRoot({})에서 synchronize: true, 가 되어있을 시 db오류가 나는데 제가 다른 것을 잘못 설정한 것인가요?

  • javascript
  • node.js
  • express
  • docker
  • tdd
  • rest-api
  • nestjs
yskim 댓글 1 좋아요 0 조회수 441

Presentation Layer 테스트 (1) 관련 질문이 있습니다!

미해결

Practical Testing: 실용적인 테스트 가이드

안녕하세요! PresentationLayer 테스트(1) 수강하며 문득 든 궁금증이 있어서 질문을 드립니다. 강의 36:03 쯔음에서 Product 가 하나도 저장되지 않은 상태를 테스트할 때, 새로운 Product 의 최신 번호를 조회하게 되면 "001" 이 되는 과정에서 ActiveProfile 을 test 로 해주지 않아 DB에 데이터가 임의로 들어가 있던 것 때문에 테스트 통과가 되지 않았는데요. 그러면 그 전에 진행했던 createProduct 테스트의 given에서 Product 를 하나 저장한다면 여기서도 ActiveProfile 이 test 이지 않았던 상태였기 때문에 저장한 데이터가 4번째 데이터가 되어야 하고 그랬다면 테스트 통과가 안 되어야 하는게 맞지 않았나..? 하는 갑작스러운 의문이 들었습니다. 제가 놓치고 있는게 무엇일까요?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
비가싫어요 댓글 2 좋아요 0 조회수 1087

Spring REST Docs 관련 질문

해결됨

Practical Testing: 실용적인 테스트 가이드

안녕하세요 강사님, 우선 꿀팁 가득차있는 강의 너무너무 잘 들었습니다. Spring REST Docs 관련해서 질문이 있습니다. 강의에서는 이미 레이어별로 테스트 코드를 작성하였는데요. Spring REST Docs 적용하면서 별도의 ProductControllerDocsTest 클래스를 만들어 createProduct()의 동일한 테스트 코드가 문서를 위해 또 들어가는 것 같아 관리해야할 테스트 코드가 두배가 되는게 아닌가 궁금해서 질문드립니다! 실무에서는 이렇게 테스트 전용 테스트코드와 문서용 테스트 코드를 별도 분리하는지, 아니면 둘을 함께 포함하여 하나로 작성하는 방식인가요? ~ 감사합니다.

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
lina 댓글 1 좋아요 1 조회수 738

nodejs express에서 type(commonjs,module) 관련 질문

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

서버작동을 위한 node app.js를 실행할때에 dotenv를 require, import를 하면서 문의점이 발생했습니다. //server.js import { creatApp } from "./app.js"; import database from "./models/database.js"; const startServer = async () => { try { await database; const app = creatApp(); const PORT = process.env.PORT; app.listen(PORT, () => { console.log(`server is listening on ${PORT}👌`); }); } catch (err) { console.log(`Failed server connect❌`); database.destroy(); } }; startServer(); //database.js import { createConnection } from "typeorm"; import dotenv from "dotenv"; dotenv.config(); const database = createConnection({ type: process.env.DB_CONNECTION, host: process.env.DB_HOST, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, port: process.env.DB_PORT, database: process.env.DB_DATABASE, }); export default database; 이렇게 진행하면 정상적으로 서버가 정상적으로 작동하지만 database.js에서의 dotenv import 부분을 require방식으로 server.js에 옮겨놓으면 에러가 발생합니다. 근본적으로 commonJS(require)방식과 module(import)방식에 대해서 dotenv를 불러올때에 require를 쓰면 server.js에 적용할때는 정상적으로 작동하는데 import를 똑같은상황에서 적용하려면 왜 database.js로 넘어가야하는지 그게 궁금해졌습니다! require와 import를 해올 때 전반적으로는 rquire는 동기적이고 import비동기적인 성질(?)때문이라고 하기에 영향이 있는건지.. 근본적인 이해가 되지 않아서요..ㅠㅜ 도움 부탁드리겠습니다 ㅠㅜ!!!!

  • javascript
  • node.js
  • express
  • docker
  • tdd
  • rest-api
  • nestjs
zeler1004 댓글 1 좋아요 0 조회수 530

양방향 매핑

해결됨

Practical Testing: 실용적인 테스트 가이드

안녕하세요~ 양방향 매핑을 사용하면 엔티티 간의 결합도를 높이기 때문에 가급적 단방향으로 만들면 좋다는 의견도 많은 것 같더라구요. 심지어는 양방향 매핑을 만들어야 한다면 엔티티가 아니라 id 값을 넣어서 참조를 하는게 더 좋다는 의견도 있구요. 강의에서는 양방향 매핑을 사용하셨는데 실무에서도 자주 양방향 매핑으로 설계하시나요? 사용하신다면 이러한 단점이 있지만 편의성이 더 크기 때문인가요?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
yhwjd 댓글 1 좋아요 1 조회수 750

강의자료

해결됨

Practical Testing: 실용적인 테스트 가이드

강의하시는 PPT 파일 다운로드 받을 수 있을까요..?

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
김노아 댓글 1 좋아요 0 조회수 333

addSeveralBeverages() 경계값 테스트

해결됨

Practical Testing: 실용적인 테스트 가이드

CafeKiosk add()는 count 0이 경계값이라 0과 1로 테스트를 만들어야 할거 같은데 addSeveralBeverages() test에서는 count 2로 2개다 아메리카노로 add되었는지 확인하셔서 문의드립니다 실무라고 가정하면 count 0, 1, 2이상 값 3가지 경우로 test 작성해야하는 건가요??

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
이곰 댓글 1 좋아요 0 조회수 578

테스트를 위한 메소드를 작성해도 괜찮은건가요?

미해결

Practical Testing: 실용적인 테스트 가이드

학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 선생님. 강의 정말 재밌게 잘 듣고 있습니다. 이번 강의에서는 실제 비즈니스 로직으로 사용 될 createOrder() 로직을 작성하고 오로지 test 를 위한 createOrder(LocalDateTime currentDateTime) 메소드를 추가로 작성하였는데 이처럼 오로지 테스트를 위한 메소드를 작성해도 괜찮은 것인지 궁금 해서 질문을 남겨봅니다 ! 다른 개발자라면 처음 봤을 때, 같은 이름의 메소드가 두개라서 만약 해당 메소드를 호출하는 경우 직접 코드를 확인해봐야 하는 불편함이 있을 것 같은데 이런 경우 어떻게 해결하나요??

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
71kimty 댓글 2 좋아요 0 조회수 915

만료되었는지 확인하는 메서드 검증

해결됨

Practical Testing: 실용적인 테스트 가이드

유익한 강의 만들어주셔서 감사합니다. 무분별하게 FakeRepository를 만들면서 실제 프로덕션 코드에서 작동하는것과 똑같이 내가 FakeRepository를 만들었을 거란 확신이 없이 테스트를 작성하던 와중에 이 강의를 보고 좀 깨우친 바가 많았습니다. 해당 강의를 듣다가 이 케이스에서는 어떻게 검증하기 쉽도록 개선해볼 수 있을까 해서 질문드립니다. 인증 코드라는 도메인 객체가 있습니다. 인증코드는 만료시간이라는 속성을 가지고 있고, isExpired()라는 메서드를 통해 해당 인증코드가 만료되었는지 확인할 수 있습니다. public boolean isExpired() { return LocalDateTime.now().isAfter(expirationTime); } 강의를 듣기 전에는 이런 식으로 작성했습니다. 그런데 이런 식으로 작성하니 테스트 코드를 짜려고 하면 Fixture 설정 시 LocalDateTime.now ()를 사용해서 만료일자를 설정해야 한다는 생각이 듭니다. 이런 경우에도 만료되었는지 검증할 수 있는 시간을 파라미터로 받도록 리팩토링해주는 것이 맞을지 궁금합니다!

  • spring
  • tdd
  • jpa
  • mockito
  • 소프트웨어-테스트
  • junit5
y2gcoder 댓글 1 좋아요 0 조회수 1022

인기 태그

인프런 TOP Writers

주간 인기글