묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
Refresh token 과 Access token 의 차이점
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 통합 링크https://links.codefactory.aiFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! 안녕하세요 강사님, Refresh token 과 Access token 의 차이 점은 아래 두개만 있는걸로 이해하면 될까요?만료 시간사용처 (access token 은 데이터 접근시, refresh token 은 access token 발급 시에 사용) 그 외에 인증 방식, payload data, 관리 방식은 모두 동일하다고 이해하면 될까요?
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
create posts 부분에서의 에러 발생
https://www.inflearn.com/course/lecture?courseSlug=spring-boot-restful-web-services&unitId=39127&tab=community&category=questionDetail&q=222413해당 강의에서의 posts create 부분에 500 interna error가 발생해서 문의드립니다 package com.example.restfulwebservice.bean; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.*; @Entity @Data @NoArgsConstructor @AllArgsConstructor public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String description; // 게시물:사용자는 N:1 관계 // JsonIgnore 통해서 정보를 가져오지 않음 @ManyToOne(fetch = FetchType.LAZY) // FetchType.LAZY는 지연 로딩, 사용자 데이터를 필요한 시점에 가져옴. 즉시 로딩 안함 @JsonIgnore // 다른 엄한 JsonIgnore를 불러오는 바람에 N+1 문제가 너무 크게 발생함.... private User user; } Post.java package com.example.restfulwebservice.Controller; import com.example.restfulwebservice.bean.Post; import com.example.restfulwebservice.bean.User; import com.example.restfulwebservice.exception.UserNotFoundException; import com.example.restfulwebservice.exception.UsersAndCountResponse; import com.example.restfulwebservice.repository.PostRepository; import com.example.restfulwebservice.repository.UserRepository; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import javax.validation.Valid; import java.net.URI; import java.util.Date; import java.util.List; import java.util.Optional; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; @RestController @RequestMapping("/jpa") public class UserJPAController { private UserRepository userRepository; private PostRepository postRepository; public UserJPAController(UserRepository userRepository){ this.userRepository = userRepository; } // /jpa/users @GetMapping("/users") public List<User> retrieveAllUsers(){ return userRepository.findAll(); } // ResponseEntity를 사옹한 정답 코드 @GetMapping("/usersAndCount") public ResponseEntity retrieveAllUsersAndCount(){ List<User> users = userRepository.findAll(); int count = users.size(); UsersAndCountResponse result = UsersAndCountResponse.builder() .count(users.isEmpty() ? 0 : users.size()) .users(users) .build(); EntityModel entityModel = EntityModel.of(result); WebMvcLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers()); entityModel.add(linkTo.withSelfRel()); return ResponseEntity.ok(entityModel); } // jpa/users/{id} @GetMapping("/users/{id}") public ResponseEntity retrieveUsersById(@PathVariable int id){ Optional<User> user = userRepository.findById(id); if (!user.isPresent()){ throw new UserNotFoundException("id - " + id); } EntityModel entityModel = EntityModel.of(user.get()); WebMvcLinkBuilder lintTo = linkTo(methodOn(this.getClass()).retrieveAllUsers()); entityModel.add(lintTo.withRel("all-users")); return ResponseEntity.ok(entityModel); } @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable int id){ userRepository.deleteById(id); } // /jpa/users @PostMapping("/users") public ResponseEntity<User> createUser(@Valid @RequestBody User user){ if(user.getJoinDate() == null) user.setJoinDate(new Date()); User savedUser = userRepository.save(user); // USER CREATED // /users/4 // 생성된 User의 URI를 저장 후 반환하기 URI location = ServletUriComponentsBuilder .fromCurrentRequest() .path("/{id}") .buildAndExpand(savedUser.getId()) .toUri(); return ResponseEntity.created(location).build(); } @GetMapping("/users/{id}/posts") public List<Post> retrieveAllPostByUser(@PathVariable int id){ Optional<User> user = userRepository.findById(id); if(!user.isPresent()){ throw new UserNotFoundException("id-" + id + " user not found"); } return user.get().getPosts(); } @PostMapping("/users/{id}/posts") public ResponseEntity<Post> createPost(@PathVariable int id, @RequestBody Post post) { Optional<User> userOptional = userRepository.findById(id); if (!userOptional.isPresent()) { throw new UserNotFoundException("id-" + id); } User user = userOptional.get(); post.setUser(user); postRepository.save(post); URI location = ServletUriComponentsBuilder .fromCurrentRequest() .path("/{id}") .buildAndExpand(post.getId()) .toUri(); return ResponseEntity.created(location).build(); } } UserJPAController.java 파일이고, user의 post 통한 생성과 get 통한 id로 해당 사용자 post 조회는 이상 없습니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part6: 웹 서버
DB 설정 관련해서 질문 드립니다
[Table("UserTable")] public class UserData { [Key] public string UserId { get; set; } public string? Token { get; set; } [MaxLength(32)] public string? UserName { get; set; } public DateTime? CreateTime { get; set; } public BanData? Ban { get; set; } public ICollection<MailData> OwnMails { get; set; } public ICollection<GetMailData> GetMails { get; set; } } [Serializable] public class BanData { public DateTime Start { get; set; } public DateTime End { get; set; } public int State { get; set; } public string DescKey { get; set; } // Foreign Key public string UserId { get; set; } public UserData User { get; set; } } public class MailData { /// <summary> 우편물 구분 값 </summary> [Key] public long Id { get; set; } /// <summary> 발송일 </summary> public DateTime SendDate { get; set; } /// <summary> 우편물 받아야하는 기간 </summary> public DateTime EndDate { get; set; } /// <summary> 우편 내용물 </summary> public string Body { get; set; } /// <summary> 보낸이 ex)GM, DEV 등등 </summary> public string Sender { get; set; } // Foreign Key public string UserId { get; set; } public UserData User { get; set; } } /// <summary> 우편물 획득 시 </summary> public class GetMailData { /// <summary> 우편물 구분 값 </summary> [Key] public long Id { get; set; } /// <summary> 우편물 시간제한에 의한 삭제 </summary> public bool IsTimeOut { get; set; } /// <summary> 받은 날 </summary> public DateTime GetDate { get; set; } /// <summary> 우편 내용물 </summary> public string Body { get; set; } /// <summary> 보낸이 ex)GM, DEV 등등 </summary> public string Sender { get; set; } // Foreign Key public string UserId { get; set; } public UserData User { get; set; } }이렇게 SharedData.Models 정의를 해서 사용을 하고자 합니다 UserData에서만 DB 컬럼으로 활용을 하고싶습니다 ApplicationDbContext.csprotected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Ignore<BanData>(); modelBuilder.Ignore<MailData>(); modelBuilder.Ignore<GetMailData>(); }에는 DB로 만들어지지 않았으면 해서 예외처리를 추가했습니다 UserTableUserIdTokenUserNameCreateTimeBanData BanICollection<MailData> OwnMailsICollection<GetMailData> GetMails이런식으로 생성하게 하려면 어떻게해야 하나요?
-
미해결비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
PM2 EADDRINUSE 에러
강의 보면서 PM2 배포를 따라해보았습니다. 5999번 포트를 사용했고, 몇 번 API 요청을 하면 EADDRINUSE 에러가 뜹니다. 0|index | Error: listen EADDRINUSE: address already in use :::5999 0|index | at Server.setupListenHandle [as listen2] (node:net:1872:16) 0|index | at listenInCluster (node:net:1920:12) 0|index | at Server.listen (node:net:2008:7) 0|index | at Function.listen (/home/ubuntu/hyerim-resume/server/nodemodules/express/lib/application.js:635:24) 0|index | at Object.<anonymous> (/home/ubuntu/hyerim-resume/server/index.js:6:11) 0|index | at Module._compile (node:internal/modules/cjs/loader:1376:14) 0|index | at Module._extensions..js (node:internal/modules/cjs/loader:1435:10) 0|index | at Module.load (node:internal/modules/cjs/loader:1207:32) 0|index | at Module._load (node:internal/modules/cjs/loader:1023:12) 0|index | at Object.<anonymous> (/home/ubuntu/.nvm/versions/node/v21.2.0/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23) { 0|index | code: 'EADDRINUSE', 0|index | errno: -98, 0|index | syscall: 'listen', 0|index | address: '::', 0|index | port: 5999 0|index | } 이 에러가 이미 사용중인 포트로 실행하려고 하는 문제라고 해서 매번 sudo lsof -i :5999, sudo kill -9 ~~ 로 서버를 껐다 키면 또 금방 해당 에러가 발생합니다. sudo lsof -i :5999 로 실행중인 프로세스를 확인하면 다음과 같습니다. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME node\x20/ 1396 root 25u IPv6 451174 0t0 TCP ip-172-31-39-74.ap-northeast-2.compute.internal:5999->121.143.65.200:56521 (ESTABLISHED) node\x20/ 1396 root 26u IPv6 20785 0t0 TCP *:5999 (LISTEN) node\x20/ 1396 root 30u IPv6 451237 0t0 TCP ip-172-31-39-74.ap-northeast-2.compute.internal:5999->121.143.65.200:56645 (ESTABLISHED) Mac M2 로 서버에 접근해서 PM2를 실행하는데, Mac에서 AirPlay 모드를 꺼야 한다는 Stack Overflow 내용도 보고 꺼봤지만 역시나 에러가 뜹니다. pm2 start index.js —watch 로 pm2 인스턴스를 실행했더니 몇번 재시작을 자동으로 해주는 것 같지만 결국 재시작이 너무 잦다며 더이상 재시작이 되지 않는 것 같아요. 해결 방법이 궁금합니다 ㅠㅠ 아래는 제 서버의 package.json, index.js입니다. Package.json{ "name": "server", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node index.js" }, "author": "", "license": "ISC", "dependencies": { "compression": "^1.7.4", "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.2", "method-override": "^3.0.0", "mysql2": "^3.6.3", "nodemon": "^3.0.1", "socket.io": "^4.7.2", "winston": "^3.11.0", "winston-daily-rotate-file": "^4.7.1" } } index.jsconst express = require("./config/express"); const { logger } = require("./config/winston"); //log const port = 5999; express().listen(port); logger.info(`API Server Start At Port ${port}`);
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
퀴즈 완료 후 질문드립니다
// UserAndCountResponse.java @AllArgsConstructor @ToString @Data public class UsersAndCountResponse { private int count; private List<User> users; } // UserJPAController.java @GetMapping("/usersAndCount") public UsersAndCountResponse retrieveAllUsersAndCount(){ List<User> users = userRepository.findAll(); int count = users.size(); System.out.println(new UsersAndCountResponse(count, users)); return new UsersAndCountResponse(count, users); } UserAndCountResponse.java 파일을 exception 혹은 response 폴더에 생성하여 다음과 같은 코드를 작성하였고, 406 error가 발생하였으나 @Data 어노테이션 추가하자 잘 동작했습니다 그런데 문제의 의도는 ResponseEntity 부분에 두 정보를 포함하는 것 같은데, 관련 키워드로 찾아봐도 복수의 응답을 포함하는 방법을 찾을 수 없었기에 질문드립니다
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
퀴즈 해설 질문드립니다
JPA를 이용한 사용자 추가와 삭제 - HTTP POST/DELETE method 강의의 과제 부분의 해설이나 정답지가 있으신가요?새로운 response를 생성하거나, 혹은 ResponseEntity에서 복수 정보를 반환하는 식으로 접근하려 하는데 맞는 접근 방법인지 모르겠습니다
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
yml파일에서 jpa설정을하고 에러가나요
Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [boolean] for value [ture]이런 오류가나는데 뭐가 문제일까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
상품수정 API 질문
상품 수정 api 질문합니다. 지금 보시면 update에는 async,await가 붙어있는데 데이터베이스를 거쳐 resolver로 가져오면 굳이 안붙어도 된다고 하셨는데 왜 붙어있는지 궁금합니다async update( {product,updateProductsService }:IProductsServiceUpdate):promise<Product> { const product=await this.findOne({productId}) this.checkSoldout({product}) }
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
조회 시, select로 일부 필드만 가져올 때 GraphQL 처리
안녕하세요 :)아래 코드와 같이 상품 조회할 때 select를 통해 일부 필드만 가져오도록 해봤습니다.service의 findAll 메서드에서는 유틸리티 타입으로 반환하도록 하였고,resolver에서는 Query 데코레이터에 GraphQL에서 제공하는 PickType으로 반환하게 했는데, 에러가 발생합니다.. (적절한 값이 아니라는 에러 내용)이런 상황에서는 메서드 반환 타입과 GraphQL 타입 처리를 어떻게 해주는 것이 좋은지 감이 잘 안 잡혀서 질문드려요! // products.resolver.ts @Query(() => [PickType(Product, ['id', 'name', 'description'])]) fetchProducts(): Promise<Pick<Product, 'id' | 'name' | 'description'>[]> { return this.productsService.findAll(); }// products.service.ts findAll(): Promise<Pick<Product, 'id' | 'name' | 'description'>[]> { return this.productsRepository.find({ select: ['id', 'name', 'description'], }); }
-
미해결비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
인스턴스 중단 후 재시작
프로젝트를 완성하고 aws 인스턴스 프리티어 사용량이 제한량에 거의 도달해서 항상 켜놓으면 안되겠다고 생각해서 잠깐 중단시켰다가 며칠후에 재시작 시켰는데 재시작 한 이후로 지도상에 핀이 안 보이는데 어떻게 해야할까요? pm2도 해놔서 인스턴스를 중단했다가 재시작한것 때문인거 같은데... mysql을 접속하려 했을때 이런 창이 뜹니다.
-
해결됨[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
섹션 26. 이미지 업로드 - 클래식 방법에서 질문이 있습니다!
안녕하세요!이미지 업로드 클래식 방법을 듣다 막히는 부분이 있어 질문 드립니다! @Post() @UseGuards(AccessTokenGuard) @UseInterceptors(FileInterceptor('image')) postPosts( @User('id') userId: number, @Body() body: CreatePostDto, @UploadedFile() file?: Express.Multer.File, console.log(userId); return this.postsService.createPost(userId, body, file?.filename); }컨트롤러에 해당 셋팅까지 마무리하고 postman으로 요청을 보내려고 시도를 했습니다. 하지만 400에러가 발생하더라고요 ㅠㅠ에러 message는 "Multipart : Malformed part header" 라고 표출이 됩니다. postman의 헤더 설정 문제인가해서 header셋팅하는 쪽 살펴보니 자동으로 header 설정이 되고 있어서 문제는 없는 것 같습니다.. 일단 컨트롤러에 요청자체가 걸리지 않는 것 같습니다ㅠ혹시 어떤 이유 일까요?
-
해결됨Java 마이크로서비스(MSA) 프로젝트 실습
직접 어플리케이션 서버에 요청을 보내면 동작하는데, gateway 서버로 보내면 404가 뜹니다
config-server / eureka-server / gateway-server /그리고 item-service-server 대신에 제가 만드는 rms라는 애플리케이션 서버를 띄웠습니다.게이트웨이 서버를 통해서 http 요청을 보내면 404가 뜨고직접 애플리케이션 서버로 요청을 보내면 잘 동작하는 상태입니다.그래서 config-server의 gateway-server-local.yml 파일에서 spring.cloud.gateway 부분에 문제가 있을거라 추측하고 계속 찾아봤는데... 어떻게 변경해야 할지.. 잘 모르겠어서 질문드립니다. 일단 파일 전체를 공유하겠습니다.config-serverresources.application.ymlspring: application: name: config-server profiles: active: native cloud: config: server: native: search-locations: classpath:/config encrypt: enabled: false server: port: 8080 resources.bootstrap.ymlencrypt: key: IRON0000 resources.config.eureka-server-local.ymllogging: file: name: logs/eureka.log max-size: 500MB max-history: 10 level: root: info org.com.iron.eureka-server: debug spring: application: name: eureka-server server: port: 8761 eureka: instance: hostname: eureka-server client: serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ register-with-eureka: false fetch-registry: false management: endpoints: web: exposure: include: "*" resources.config.gateway-server-local.ymllogging: file: name: logs/gateway-local.log max-size: 500MB max-history: 10 level: root: info org.hibernate.SQL: debug # org.hibernate.type: trace spring: application: name: gateway-server cloud: gateway: routes: - id: rms uri: lb://rms eureka: instance: prefer-ip-address: true client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka resources.config.rms.ymllogging: file: name: logs/api.log max-size: 500MB max-history: 10 level: root: info org.hibernate.SQL: debug # org.hibernate.type: trace spring: datasource: url: jdbc:h2:tcp://localhost/~/server-iron username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true default_batch_fetch_size: 1000 #최적화 옵션 mybatis: mapper-locations: mybatis/mappers/*.xml springdoc: default-consumes-media-type: application/json default-produces-media-type: application/json swagger-ui: operations-sorter: alpha disable-swagger-default-url: true display-query-params-without-oauth2: true resources.config.rms-local.ymllogging: file: name: logs/rms-local3.log max-size: 500MB max-history: 10 level: root: info org.hibernate.SQL: debug # org.hibernate.type: trace spring: datasource: url: jdbc:h2:tcp://localhost/~/server-iron username: sa password: '{cipher}' driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true default_batch_fetch_size: 1000 #최적화 옵션 mybatis: mapper-locations: mybatis/mappers/*.xml springdoc: default-consumes-media-type: application/json default-produces-media-type: application/json swagger-ui: operations-sorter: alpha disable-swagger-default-url: true display-query-params-without-oauth2: true token: expiration_time: 86400000 secret: IRON0000 eureka: instance: instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}} prefer-ip-address: true client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka eureka-server.ymlresources.bootstrap.ymlspring: application: name: eureka-server profiles: active: local cloud: config: uri: http://localhost:8080 loadbalancer: ribbon: enabled: false gateway-serverresources.bootstrap.ymlserver: port: 8070 spring: application: name: gateway-server profiles: active: local cloud: config: uri: http://localhost:8080 loadbalancer: ribbon: enabled: false management: endpoints: web: exposure: include: refresh, health, beans rmsresources.bootstrap.ymlserver: port: 0 spring: application: name: rms profiles: active: local cloud: config: uri: http://localhost:8080 loadbalancer: ribbon: enabled: false refresh: extra-refreshable: com.zaxxer.hikari.HikariDataSource management: endpoints: web: exposure: include: refresh, health, beans build.gradle 파일들도 올려야할까요...
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
청개구리 기질로 npm을 쓰는 분들을 위한 launch.json 파일 공유
청개구리 기질로 npm으로 하고 싶어서 강의를 따라오다 여기서 막혀서 구글링 삽질로 해결 했던 정보를 공유 해요~// launch.json{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", // 세팅의 타입 "request": "launch", // launch 실행하는거, attach 실행되있는거에 붙는거 "name": "Debug NestJS", // 어떤 이름으로 부를건지 "runtimeExecutable": "npm", // 어떤걸로 실행 할건지 node, yarn ... "runtimeArgs": ["run", "start:debug"], // npm run start:dev 에서 npm이 runtime이고 run start:dev가 Args임 "console": "integratedTerminal", // intergratedTerminal은 vscode에서 실행하는 터미널임 "restart": true, // 자동 연결 할건지 "port": 9229, "autoAttachChildProcesses": true // 디버거를 자동으로 process에 붙을지 말지 결정 } ] }
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
vscode의 디버거를 덕분에 알게 되었는데
강의를 다 보고 나니 너무 좋은 기능인것 같고, 실제로 해당 기능을 개발 단계에서 사용 할때는 따로 winston이나 내장 logger나 console.log 필요 없이(production에선 사용) 해당 디버거를 이용해서 하는게 훨씬 좋아 보이는데, 실무에서도 자주 사용 하시나요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
상품 등록 API 오류 납니다
ERROR [TypeOrmModule] Unable to connect to the database Retrying (2)... QueryFailedError: Incorrect datetime value: '0000-00-00 00:00:00' for column 'meetingTime' at row 1라고 오류납니다 product.resolver.tsimport { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; import { ProductsService } from './product.service'; import { CreateBoardInput } from '../boards/dto/create-board.input'; import { CreateProductInput } from './dto/create-product.input'; import { Product } from './entities/product.entity'; @Resolver() export class ProductsResolver { constructor( private readonly productsService: ProductsService, // ) {} @Query(() => [Product]) fetchProducts(): Promise<Product[]> { return this.productsService.findAll(); } @Query(() => Product) fetchProduct( @Args('productId') productId: string, // ): Promise<Product> { return this.productsService.findOne({ productId }); } @Mutation(() => Product) createProduct( @Args('createProductInput') createProductInput: CreateProductInput, ): Promise<Product> { // << 브라우저에 결과 보내주는 2가지 방법>> // 1. 등록된 내용이 담긴 객체를 그대로 브라우저에 보내주기 return this.productsService.create({ createProductInput }); // 이걸 선호. 조회 api 요청을 안해도 된다 // 2.결과에서만 간단히 보내주기 // return '정상적으로 상품이 등록되었습니다' } } product.service.tsimport { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; import { ProductsService } from './product.service'; import { CreateBoardInput } from '../boards/dto/create-board.input'; import { CreateProductInput } from './dto/create-product.input'; import { Product } from './entities/product.entity'; @Resolver() export class ProductsResolver { constructor( private readonly productsService: ProductsService, // ) {} @Query(() => [Product]) fetchProducts(): Promise<Product[]> { return this.productsService.findAll(); } @Query(() => Product) fetchProduct( @Args('productId') productId: string, // ): Promise<Product> { return this.productsService.findOne({ productId }); } @Mutation(() => Product) createProduct( @Args('createProductInput') createProductInput: CreateProductInput, ): Promise<Product> { // << 브라우저에 결과 보내주는 2가지 방법>> // 1. 등록된 내용이 담긴 객체를 그대로 브라우저에 보내주기 return this.productsService.create({ createProductInput }); // 이걸 선호. 조회 api 요청을 안해도 된다 // 2.결과에서만 간단히 보내주기 // return '정상적으로 상품이 등록되었습니다' } } productSaleslocation.entity.tsimport { Field, Float, ObjectType } from '@nestjs/graphql'; import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity() @ObjectType() export class ProductSaleslocation { @PrimaryGeneratedColumn('uuid') @Field(() => String) id: string; @Column() @Field(() => String) address: string; @Column() @Field(() => String) addressDetail: string; // // 9자리 중에서 6자리가 소수점 @Column({ type: 'decimal', precision: 9, scale: 6 }) @Field(() => Float) lat: number; @Column({ type: 'decimal', precision: 9, scale: 6 }) @Field(() => Float) lng: number; @Column() @Field(() => Date) meetingTime: Date; } meetingTime graphlql 타입을 맞게 해났는데 왜 오류나는지 모르곘습니다
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
yml 파일 수정 후에는 SecurityConfig 클래스를 삭제해야 하나요?
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>3.0.4</version> </dependency>import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; @Configuration public class SecurityConfig { @Bean UserDetailsService userDetailsService() { InMemoryUserDetailsManager userDetailsManager = new InMemoryUserDetailsManager(); UserDetails newUser = User.withUsername("user") .password(passwordEncoder().encode("passw0rd")) .authorities("read") .build(); userDetailsManager.createUser(newUser); return userDetailsManager; } @Bean BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } pom.xml에 있는 spring-boot-starter-security를 주석처리하게 되면 SecurityConfig 클래스에서 오류가 발생합니다. 이 클래스는 그대로 주석처리 하면 되는 건가요?
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
3분50초쯤에 오버라이드라고 말씀 하셨는데
Column().d.ts에서 declare로 정의 되어 있는것들을 오버라이드라고 말씀 하셨는데, 인자값에 따라 다른 호출을 하는건 오버로딩이 아닌가해서요!
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
Exception Class 생성문의 추가 질문
안녕하세요. 강사님 답변 감사합니다.답변해 주신 것으로는실무에서도 사용자 정의 예외 클래스를 사용하는 것으로 이해했습니다. 추가로 질문드리고 싶은 것이 있는데첫 번째 질문으로는 사용자 정의 클래스를 사용할 때 상위 예외를 상속할 때 보통 RuntimeException을 상속해서 만드는지 디테일한 Exception을 상속하여 생성하는지 질문드리고 싶습니다! 두 번째 질문으로는 자바의 예외 클래스를 사용할 때보다 사용자 정의 클래스를 생성하여 사용하는 게 답변해 주신 것처럼"직접 예외 클래스를 생성하면 메시지나 처리 제어 등이 가능합니다."라는 장점으로예외 처리를 할 때 사용 빈도가 훨씬 더 많을 것 같다고 개인적으로 생각을 하고 있는데실무에서는 자바의 예외 클래스를 사용하는 것보다는예외 클래스를 직접 생성하여 사용하는 경우가 훨씬 더 많을까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
return false 대신 try catch
function TokenAPI(phNumber){ try { checkPhoneState(phNumber); //휴대폰 상태 점검 } catch (error) { console.log(error); } const token = createToken(); //토큰발급 sendToken(phNumber,token); //휴대폰에 토큰 발송 } function checkPhoneState(phNumber){ if(phNumber.length != 11){ throw new Error("올바르지 않은 번호입니다."); } else if(isNaN(phNumber) != false){ throw new Error("올바르지 않은 번호입니다."); } } function createToken(){ return String(Math.floor(Math.random() * 1000000)).padStart(6,"0"); } function sendToken(phNumber,token){ console.log(phNumber + "번호로 인증번호 " + token + "이 전송되었습니다."); } 이런식으로 try catch 써도 되나요?
-
미해결[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core
common.service 의 cursorPaginate 일반화 할때 nextUrl 생성시 질문입니다.
common.service 의 cursorPaginate 일반화 관련 질문입니다.nextUrl 생성할 때 아래와 같이 searchParams 를 생성하는데 이 부분은 일반화 할 수없는건가요?if (nextUrl) { for (const key of Object.keys(dto)) { if (dto[key]) { if ( key !== 'where__id__more_than' && key !== 'where__id__less_than' ) { nextUrl.searchParams.append(key, dto[key]); } } } let key = null; if (dto.order__createdAt === 'ASC') { key = 'where__id__more_than'; } else { key = 'where__id__less_than'; } nextUrl.searchParams.append(key, lastItem.id.toString()); }