이야기를 나눠요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
Slack 클론 코딩[백엔드 with NestJS + TypeORM]
typeORM에 대한 질문이 있습니다.
- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 개인 프로젝트까지 생각해서 강의를 들어보고 있는데 ORM 기능이란 것을 처음 사용하다보니 미숙합니다. 현재 개인 프로젝트를 AWS RDS에 올리고 EC2 외부에서는 SSH 터널링을 통해 접속가능하게 설정해놓았는데 typeORM에서는 Connection을 SSH 터널링을 통해 가능한가요? TypeORM.IO에서도 내용이 없어서 불가능한 부분인지 궁금합니다
-
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
<block end>, but found '<block mapping start>'
spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: truelogging.level: org.hibernate.SQL: debug# org.hibernate.type: trace pdf 뷰어마다 달라서 에러 뜨는경우가 있네요
-
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
<block end>, but found '<block mapping start>' 에러 뜨시는분들
삭제된 글입니다
-
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
KafkaOrderDto 및 4개 클래스 통합Dto 작성 공유
안녕하세요. 강의중, kafka의 connect를 위한 dto (kafkaOrderDto) 를 만드는 부분이 있는데 강사님께서는 kafkaOrderDto, schema, payload, field 를 4개 클래스화 하여 사용하셨습니다. 또한 이에 따라 producer와 controller에 해당 dto를 세팅키 위한 코드들이 들어 있습니다. 그런데 저는 이부분이 귀찮아서(..) 클래스를 1개로 통합하여 사용하는 방법으로 짜보았습니다. 저보다 고수님들은 많으실테지만 편의를 위해 통합 Dto를 공유하여 봅니다. 1. KafkaConnectOrderDtoV1 (버전1) package com.hwan2272.msaecomms.dto;import lombok.AllArgsConstructor;import lombok.Data;import java.util.Arrays;import java.util.Date;import java.util.List;@Datapublic class KafkaConnectOrderDtoV1 { private Schema schema; private Payload payload; public KafkaConnectOrderDtoV1() { this.setSchemaInit(); } public KafkaConnectOrderDtoV1(OrderDto orderDto) { this.setSchemaInit(); this.setPayloadFromOrderDto(orderDto); } public void setSchemaInit() { Schema sch = new Schema("struct", Arrays.asList( new Field("string", true, "order_id"), new Field("string", true, "user_id"), new Field("string", true, "product_id"), new Field("int32", true, "qty"), new Field("int32", true, "unit_price"), new Field("int32", true, "total_price") ), false, "orders"); this.setSchema(sch); } public void setPayloadFromOrderDto(OrderDto orderDto) { Payload pay = new Payload( orderDto.getOrderId(), orderDto.getUserId(), orderDto.getProductId(), orderDto.getQty(), orderDto.getUnitPrice(), orderDto.getTotalPrice(), orderDto.getCreatedAt() ); this.setPayload(pay); } @Data @AllArgsConstructor public class Schema { private String type; private List<Field> fields; private boolean optional; private String name; } @Data @AllArgsConstructor public class Field { private String type; private boolean optional; private String field; } @Data @AllArgsConstructor public class Payload { private String order_id; private String user_id; private String product_id; private Integer qty; private Integer unit_price; private Integer total_price; private Date created_at; }} schema, payload, field 를 모두 inner class 화 시키고, 메소드를 만들어 내부에서 셋팅이 되도록 했습니다. 여기에서, 개선점 몇가지가 보여 수정했습니다. 1) schema와 payload를 보면 orderDto와 필드명을 비교했을때 필드명이 단순히 CamelCase -> UnderScore 형태이다. => 파라미터로 Dto를 던져 필드명만 파싱하면 될것 2) 1을 적용할때 payload를 굳이 inner class화 안해도 될것 같다. => HashMap으로 변환 3) schema와 payload를 세팅하는 Dto의 변환 로직을 비슷하게 하면 될것 같다. => for 문으로 Dto를 돌아 필요한 세팅을 지정 이외 이런저런 생각들을 기반으로, V2도 만들게 됐습니다. 2. KafkaConnectOrderDtoV2 (버전2) package com.hwan2272.msaecomms.dto;import com.google.common.base.CaseFormat;import lombok.AllArgsConstructor;import lombok.Data;import java.util.*;@Datapublic class KafkaConnectOrderDtoV2 { private Schema schema; //private Payload payload; private Map<String, Object> payload; /*public KafkaConnectOrderDtoIncrease() { this.setSchemaInit(); }*/ public KafkaConnectOrderDtoV2(OrderDto orderDto) throws Exception { this.setSchemaInit(orderDto); this.setPayloadFromOrderDto(orderDto); } public void setSchemaInit(OrderDto orderDto) { List<Field> fieldList = new ArrayList<>(); for(java.lang.reflect.Field f : orderDto.getClass().getDeclaredFields()) { if(!f.getName().equals("createdAt")) { String underscoreField = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, f.getName()); String simpleType = f.getType().getSimpleName(); Field field = new Field( (simpleType.toLowerCase().contains("string") ? "string" : simpleType.toLowerCase().contains("integer") ? "int32" : simpleType.toLowerCase().contains("date") ? "int64" : ""), true, underscoreField ); fieldList.add(field); } } Schema sch = new Schema( "struct", fieldList, false, "orders"); this.setSchema(sch); } public void setPayloadFromOrderDto(OrderDto orderDto) { Map<String, Object> payMap = new LinkedHashMap<>(); for(java.lang.reflect.Field f : orderDto.getClass().getDeclaredFields()) { f.setAccessible(true); String underscoreField = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, f.getName()); Object data = null; try { data = f.get(orderDto); } catch (IllegalAccessException e) { e.printStackTrace(); } payMap.put(underscoreField, data); } this.setPayload(payMap); } @Data @AllArgsConstructor public class Schema { private String type; private List<Field> fields; private boolean optional; private String name; } @Data @AllArgsConstructor public class Field { private String type; private boolean optional; private String field; } /*@Data @AllArgsConstructor public class Payload { private String order_id; private String user_id; private String product_id; private Integer qty; private Integer unit_price; private Integer total_price; private Date created_at; }*/} 구글에서 제공하는 CaseFormat이 주력이 되겠습니다. com.google.common.base.CaseFormat String underscoreField = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, f.getName()); 파라미터 orderDto의 필드는 java.lang.reflect.Field으로 가져옵니다. 해당 Dto를 사용하게 되면 orderDto만 파라미터로 넣어줄시 자동으로 Dto의 필드명들을 파싱하여 schema와 payload를 만드는 효과를 갖게 됩니다. 다만 V2는 setPayload에서 try catch등의 exception 핸들링이 필요합니다. 한가지 고민은 createdAt 같은 date 형 데이터들은 kafka에서 int64로 받아들이며 실제 토픽에도 숫자형으로 들어가지만 MariaDB에서 처리가 안되는 점입니다. 구글링해보니 이를 처리키위한 kafka connect의 config설정이나 기타 방법이 있긴한것 같습니다만, 여기에서는 createdAt이라는 칼럼의 특성상, DB insert에만 의존하도록 하여야 할것으로 생각되어 Dto의 필드 파싱시에는 제외하였습니다. V1, V2 적용버전 postman에서 테스트후 MariaDB적재 모두 정상 확인했습니다. 3. Producer에서의 사용 @Service@Slf4jpublic class KafkaConnectProducer { @Autowired KafkaTemplate kafkaTemplate; public KafkaConnectOrderDtoV2 send(String topic, OrderDto orderDto) { //KafkaConnectOrderDtoV1 kafkaConnectOrderDto = new KafkaConnectOrderDtoV1(orderDto); //kafkaConnectOrderDto.setPayloadFromOrderDto(orderDto); KafkaConnectOrderDtoV2 kafkaConnectOrderDto = null; try { kafkaConnectOrderDto = new KafkaConnectOrderDtoV2(orderDto); } catch (Exception e) { e.printStackTrace(); } (저는 KafkaTemplate을 Autowired 로 사용합니다.) 결과적으로 핵심 코드는 모두 V1, V2 안에 들어 있고, controller나 producer에서는 기본 선언 정도만 하는것으로 하면 되도록 되었습니다. 코드량을 조금이라도 줄여 보고자 시작한 작업이었습니다. 참고하셔서 여러분만의 DTO를 만들어 보셔도 좋고, (JsonObject를 만들어 형태만 맞춰서 던지면 무방할듯 보입니다.) 수강생 여러분께 조금이라도 도움이 되었으면 합니다. 감사합니다.
-
스프링 핵심 원리 - 기본편
웹개발 진로에 대하여
삭제된 글입니다
-
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
명강입니다!
무료로 스프링을 배우는데 이런 명강을 듣게 되어 감사합니다 :)
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
그...버그일줄은...
GameManager아이콘이 버그일줄...몰랐네요 새로운거 알아갑니다~
-
[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
Windows 11 local 환경에서 돌리는 분들이 만나는 error 와 debug
혹시 저와 같은 환경에 같은 오류를 만나실 분들을 위해 글을 남깁니다. cuda 11.3 torch v1.11 nvidia rtx 2060 vram 6GB 1) device 못찾는 error sol) from mmdet.utils import get_device cfg.device = get_device() 2) Broken pipe Error sol) cfg.data.workers_per_gpu= 0 3) RuntimeError: Index put requires the source and destination dtypes match, got Long for the destination and int for the source. sol) data_anno = { 'bboxes': np.array(gt_bboxes, dtype=np.float32).reshape(-1, 4), 'labels': np.array(gt_labels, dtype=np.int64), 'bboxes_ignore': np.array(gt_bboxes_ignore, dtype=np.float32).reshape(-1, 4), 'labels_ignore': np.array(gt_labels_ignore, dtype=np.int64) } 4) RuntimeError: CUDA out of memory sol) cfg.data.samples_per_gpu = 1
-
게임 프로그래머 취업 전략 가이드
포트폴리오 영상 완료하였습니다.
사실 노력이 꽤나 들어간 포폴인데 뭔가 비주얼적으로 삐까뻔쩍하지 않아서 강좌에서 말하는 용가리가 크왕하는 포트폴리오하고 비슷한거 같습니다 서버 안정성보다 비주얼 부분을 더 올려야 할까요? 루키스님이 채용담당자라고 생각 하실 때 어떻게 보이시는지요 더 강하게 어필하거나 보완할 부분이 있을까요?
-
[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
리얼타임 데이터베이스 작동 안 할때
강의에 나온대로 이런식으로 작성하면 데이터베이스를 미국으로 고르지 않고 다른 지역을 골랐을 때에 리얼타임 데이터베이스의 값이 정상적으로 바뀌지 않습니다. 저는 싱가포르를 골라서 리얼타임 데이터베이스를 만들었고, 위와 같이 작성해서 동작하지 않았습니다. 데이터베이스의 위치를 미국으로 고르지 않았을 때에는 아래와 같이 데이터 베이스의 URL을 인자로 넣어주어야 정상적으로 리얼타임 데이터베이스가 작동합니다.
-
Three.js 3D 인터랙티브 바로 시작하기
강의 올려주셔서 감사합니다!
코딩일레븐님 덕분에 할 수 있는 것들이 많아지고 있습니다! 혼자서는 할 수 없지만 이렇게 길을 알려주시는 분들 덕분에 대한민국의 IT기술력이 커지고 있는 것 같습니다. 언제나 건강하시고 하시는 일 더 잘되시길 바라겠습니다!
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
2d rpg pooling
안녕하세요 제가 2d 오픈월드 rpg 게임을 구상중인데 오픈월드 전체의 데이터를 전부 메모리에 불러오면 용랑이 초과될것같아 강의에서 나온 pooling을 활용하여 플레이어 주변의 일정 범위의 데이터만 불러오고 범위를 벗어나면 삭제시켜서 성능을 올리고자 하는데 이렇게 하면 랙을 줄일 수 있을까요?
-
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
좋은 강의 만들어주셔서 감사합니다.
루키스님 강의 듣고 만들어본 응용작입니다. 오래전부터 서버지식에 대한열망이 많았는데 너무 좋은 강의를 만나 너무 기쁘게 생각합니다. 어느정도 틀을 잡아주고 응용만 하는건데도 서버와 연동 하는건 너무 힘든 작업이네요 각종 툴 만든 거 영상이랑 붙여서 포폴을 낼까 합니다. 나이가 서른 중반이 되가는데 취업이 될까 고민이군요
-
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
프로그래머스 프린터와 같은 문제네요!! 깔끔한 코드 공유합니다!
프로그래머스에서 풀때 어쩔수 없이 class를 썻던 기억이 있는데 실제로 id값을 줘서 푸네요. public class Main { public int solution(int[] arr, int k) { Queue<Person> queue = new ArrayDeque<>(); for (int i = 0; i < arr.length; i++) queue.offer(i == k ? new Person(-1, arr[i]) : new Person(arr[i])); int day = 1; while (!queue.isEmpty()) { Person p = queue.poll(); int emergency = Integer.parseInt(String.valueOf(queue.stream().filter(x -> x.number > p.number).count())); if (emergency == 0 && p.id != -1) day++; else if (emergency == 0 && p.id == -1) return day; else queue.add(p); } return day; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) arr[i] = sc.nextInt(); System.out.println(new Main().solution(arr, k)); }}
-
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
초기 form-start 프로젝트 테스트 코드 실행시 오류 발생
제공 된 소스 파일에서 테스트코드를 제 환경에서 전체로 돌려보면 에러가 발생했습니다. 테스트가 @AfterEach로 저장소를 초기화 시키고 있는데 이 경우 전체로 돌렸을 때 문제가 발생할 여지가 있는것 같습니다. 저 같은 경우는 해당 코드를 @BeforeEach 로 바꿔서 전체 테스트 통과하도록 세팅하고 강의 수강을 시작했습니다. 별거 아닌 내용이긴한데 혹시 신경쓰이시는 분이 있을까봐 공유합니다.
-
비전공 기획자 및 관리자를 위한 IT 필수 지식
잘 수강하고 있어요^^
안녕하세요. 강사님 오늘부터 수강신청해서 들으려고 해요~^^ 좋은 강의 촬영해 주셔서 감사해요 수강하다가 질문드릴 수도 있어요 잘 부탁드릴께요
-
AWS(Amazon Web Service) 입문자를 위한 강의
실습 내용이 정말 알차네요!
어떻게 하는지 궁금했던 부분을 다뤄주셨어요 정말 감사합니다 X)
-
[백문이불여일타] 데이터 분석을 위한 중급 SQL
Asian Population 문제 제목
추가 설명 중에, (2021-04-24 업데이트) Asian Population 문제는 Population Census로 문제 명칭이 변경되었습니다. 라고 되어있는데, 2022년5월 문제푸는 지금은 제목이 다시 Asian Population로 검색됩니다. 다시 제목이 돌아온건지~ 참고삼아 말씀드립니다^^
-
스프링 DB 1편 - 데이터 접근 핵심 원리
강의 자료에 사소한 오타가 있습니다.
이미 아실 수도 있지만, 강의 자료에 오타가 있어 제보 드립니다. '실행 결과'의 출력 결과를 보면, 첫 줄에 UncheckedTest 라고 되어있는 등, Check 가 아닌 Uncheck 에 대한 이름들이 보입니다. 늘 좋은 강의 감사드립니다.
-
따라하며 배우는 노드, 리액트 시리즈 - 영화 사이트 만들기
이미지 세로로 눌려서 나오시는 분들
- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 저는 GridCards에서 width : 'auto' 로 바꿔서 해결됐습니다.