블로그

f1rstf1y9

[인프런 워밍업클럽 CS 2기] 1주차 발자국👣

1주차 학습 내용운영체제운영체제의 구조커널프로세스, 메모리, 저장 장치 등을 관리사용자가 직접 접근하지 못하고, 인터페이스로만 접근 가능인터페이스GUI(Graphic User Interface)GLI(Command Line Interface)시스템콜어플리케이션은 시스템콜을 활용해 커널에 접근드라이버하드웨어와 커널의 인터페이스 컴퓨터 하드웨어와 구조메인보드 : 다른 하드웨어를 연결하는 장치로, 장치 간 데이터 전송은 메인보드의 버스가 담당CPU(Central Processing Unit, 중앙 처리 장치)산술논리 연산 장치(ALU) : 실제 데이터 연산 담당제어 장치(Control Unit) : 모든 장치들의 동작을 지시, 제어레지스터: CPU 내에서 계산을 위해 임시로 보관메모리RAM(Random Acess Memory) : 전원을 끄면 데이터가 날아감, 메인 메모리로 사용, 랜덤한 위치의 어떤 데이터를 읽든 속도가 동일ROM(Read Only Memory) : 전원을 꺼도 데이터 보관 가능, 컴퓨터 부팅 관련 바이오스 저장부팅과정컴퓨터 전원 누름 -> ROM에 저장된 BIOS 실행 -> 주요 하드웨어 이상 여부 체크 -> 이상이 없으면 부트 로더 실행 -> 운영체제를 메모리로 불러오기 -> 바탕화면이 보임인터럽트CPU 입출력 명령이 들어왔을 때 언제 완료되는지 계속 확인해야하는 폴링 방식의 단점을 해결한 것CPU가 입출력 관리자에게 명령을 내리고 자기는 다른 작업함 -> 입출력이 완료되면 CPU에게 신호를 주고 CPU는 신호를 받아서 ISR 실행시켜 작업 완료 프로그램과 프로세스프로그램하드디스크와 같은 저장장치에 저장된 명령문의 집합저장 장치만 사용하므로 수동적인 존재프로세스하드디스크에 저장된 프로그램이 메모리에 올라갔을 때, 즉 실행 중인 프로그램메모리, CPU 사용 및 입/출력 등 능동적인 존재code, data, stack, heap 영역으로 구성멀티프로그래밍과 멀티프로세싱멀티프로그래밍 : 메모리에 여러 개의 프로세스가 올라온 것멀티프로세싱 : CPU가 여러 개의 프로세스를 처리하는 것PCB(Process Control Block)프로세스의 정보를 가지고 있는 것으로, 연결리스트 자료구조로 저장됨.포인터, 프로세스 상태, 프로세스 ID, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보, CPU 스케줄링 정보 등을 저장프로세스 상태생성 -> 준비 -> 실행 -> *(대기 -> 준비 -> 실행 ->) 완료대기 상태: 입출력 요청이 들어오면 입출력이 완료될때까지 기다리는 상태컨텍스트 스위칭프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스의 상태를 저장하고 다른 프로세스의 상태값으로 교체하는 작업컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경됨쓰레드요구하는 작업의 수가 늘어나면 프로세스의 수가 늘어나고, 프로세스의 수만큼 PCB, 코드, 데이터, 스택, 힙 영역을 만들어줘야해서 무거워짐 => 이를 해결하기 위해 쓰레드 고안프로세스 내에 1개 이상 존재하며, PCB, 코드, 데이터, 힙 영역을 공유함CPU 스케줄링운영체제가 모든 프로세스에게 CPU를 할당하거나 해제하는 작업어떤 프로세스에게 CPU 리소스를 줄지, 얼마의 시간동안 CPU를 할당할지를 고려함Burst : 한 작업을 연속적으로 처리하는 것으로, 보통 작업 처리에 필요한 시간을 의미 (CPU Burst, I/O Burst)스케줄링 목표리소스 사용률 높이기, 오버헤드 최소화, 공평성, 처리량, 대기 시간, 응답 시간서로 상반되는 상황이 있기 때문에 사용하는 시스템에 따라서 목표를 다르게 설정CPU 스케줄링 알고리즘 - FIFOFirst In First Out, 먼저 들어온 작업이 먼저 나간다프로세스의 Burst Time에 따라 성능차이가 심하게 나므로 현대 운영체제에서 잘 쓰이지 않고 일괄처리 시스템에서 쓰임알고리즘자료구조와 알고리즘자료구조 : 데이터가 어떤 구조로 저장되고 어떻게 사용되는지를 나타냄알고리즘 : 어떤 문제를 해결하기 위한 확실한 방법자료구조에 따라 알고리즘이 달라지므로, 상황에 맞는 적절한 자료구조를 선택하고 이에 맞는 알고리즘을 적용할 줄 알아야함시간복잡도최선 : 빅-오메가, 평균 : 빅-세타, 최악 : 빅-오주로 빅-오 표기법을 많이 사용함성능 : O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(2^n) < O(n!)표기법계산에 가장 많은 영향을 미치는 항만 표기상수는 큰 의미 없음배열일반적인 배열크기가 정해져있고, 정해진 크기만큼 연속적인 메모리 공간에 값을 할당운영체제는 가장 첫번째 주소만 기억함참조 성능은 O(1), 삭제, 삽입 성능은 좋지 않음자바스크립트의 배열 상황에 따라서 연속적, 불연속적으로 메모리 할당하는데 대부분 불연속적으로 할당(내부적으로 연결)장점읽기, 쓰기와 같은 참조에는 O(1)의 성능을 가짐단점크기 예측이 힘들기 때문에 메모리 낭비가 발생할 수 있음데이터의 삽입, 삭제가 비효율적임연결리스트배열의 단점을 해결하기 위해 저장하려는 데이터를 메모리 공간에 분산해 할당하고, 데이터를 서로 연결해주면 됨 => Node를 만들어 수행Node의 구조 : data를 담는 변수, 다음 노드를 가리키는 변수장점배열에서 초기 크기를 알아야하는 단점이 없음중간에 데이터를 삽입 혹은 삭제하려면, 특정 노드의 다음 가리키는 노드만 바꿔주면 됨단점데이터들이 전부 떨어져있기 때문에 바로 접근하기 힘듦 => O(n)의 성능스택(Stack)First In Last Out(FILO)으로, 먼저 들어간 데이터가 가장 나중에 나오는 규칙이 있음Redo, Undo 기능, 괄호짝 검사 등에 사용큐(Queue)First In First Out(FIFO)로, 먼저 들어간 데이터가 먼저 나오는 규칙이 있음계산대에 줄을 서는 경우, 맛집 대기줄 등 일렬로 기다리는 줄을 생각하면 됨덱(Deque)데이터의 삽입과 제거를 head와 tail 두 군데서 자유롭게 할 수 있는 자료구조해시테이블(Hash Table)해시(Hash), 맵(Map), 해시맵(HashMap), 딕셔너리(Dictionary)라고도 불림해시와 테이블이 합쳐진 자료구조테이블을 그냥 배열에 저장하면, 낭비되는 공간이 발생할 수 있음테이블의 기존 인덱스를 순차적인 인덱스로 만들기 위해 어떤 계산을 하는 함수를 해시라고 함key만 알면 value에 O(1)의 성능으로 읽기가 가능삽입, 삭제, 수정도 O(1)장점빠른 데이터 탐색, 삽입, 삭제를 할 수 있음단점공간의 효율성이 좋지 않음좋은 해시 함수의 구현이 필수적임셋(Set)데이터의 중복을 허용하지 않는 자료구조해시 테이블을 이용하므로 쉽게 구현 가능해시 테이블을 사용한다고 해서 Hash Set이라고도 불림value 값은 사용하지 않고 key만 사용해서 구현함(key가 데이터)회고칭찬하고 싶은 점강의를 허투루 듣지 않기 위해서 강의 노트를 작성하면서, 좀 더 궁금한 점이 생기면 의문점을 작성해두고 추가로 찾아보는 등 디테일한 이해를 위해 노력했다. 아쉬웠던 점휴일이나 주말 등 강의를 들을 시간이 넉넉한 때를 생각하면서 당일에 들어야하는 분량을 미루는 일이 잦았다.보완해야할 점퇴근 후 피곤하더라도 완전히 그날 강의를 안듣기 보다는, 한 강의라도 들으면서 꾸준히 강의를 수강하는 습관을 들이도록 노력하자!

워밍업클럽CS발자국

[워밍업 클럽_CS 전공 스터디 2기] 1주차 발자국

강의 수강운영체제운영체제의 탄생배경과 역사를 알게 됐다.그다음 운영체제의 구조와 하드웨 구조..컴퓨터 부팅 과정까지는 재밌었지만.인터럽트부턴 좀 어려워진 것 같다. 갑자기 길을 잃은 느낌? IT에 처음 입문해서 그런 걸지도 모르겠다.그래도 계속 보다 보니 나아지는 거 같다. 일단 영상 내용을 이해하긴 했는데 지금 공부하는 게 최종적으로 무엇 때문에 필요한지,무얼 바라보고 공부하는지는 아직 모르겠다. 하지만 그래도 계속 공부하다 보면 답이 나오리라 믿는다.자료구조이건 운영체제보다 힘들었다. 자료구조와 알고리즘,자바스크립트 해보기 등등을 배웠다.하지만 나에게 For문도 그렇고 arr,wait 등등의 용어가 처음이라무슨 말인지 이해를 못해서 조사하는데 시간이 제일 오래 걸렸다.아직 이해가 덜 되서 계속 보는 중이지만. 다음 주에는 꼭 계속 복습해서 이해할 강의이다.미션일단 답을 적어본 뒤 내가 쓴 답이 확실한지 강의를 한 번 더 봤다.대체로 간단한 객관식 수준의 문제라 어려웠던 건 없었지만. 뭔가 아쉬워서 주관식스럽게 답을 써 내렸다.회고미션은 확실히 도움이 된다. 미션을 통한 공부법은 나에게 맞는 부분이라 다음주도 열심히 공부해서 더 빨리 끝내고싶다.

Taeho

인프런 워밍업 클럽 - CS Week 1

그림으로 쉽게 배우는 자료구조와 알고리즘(기본편)자료구조 & 알고리즘자료구조 : 데이터가 어떤 구조로 저장되고, 어떻게 사용되는지를 나타낸다.자료구조에 따라서 결과를 얻기 위한 처리 방법이 달라진다.알고리즘 : 어떤 문제를 해결하기 위한 확실한 방법시간 복잡도특정 알고리즘이 어떤 문제를 해결하는 데 걸리는 시간Bit-Ω : 최선의 시간 복잡도Big-O : 최악의 시간 복잡도가장 많이 사용된다.Big-θ : 평균의 시간 복잡도ADT(Abstract Data Type)데이터의 논리적인 동작을 정의한다.구현 방법을 명시하지 않고, 자료구조의 특성과 연산만을 설명한다.내부 구현 세부사항은 숨기고 인터페이스만을 제공한다.Array배열의 인덱스 참조는 길이에 상관없이 한 번에 가져온다.삽입, 삭제의 성능이 좋지 않다.Linked List배열의 단점인 삽입, 삭제의 성능을 보완하기 위한 자료구조특정 데이터를 찾고 싶다면 노드를 순차적으로 순회해야 한다.저장하려는 데이터들을 메모리에 분산하여 할당하고, 해당 데이터를 서로 연결한다.노드를 사용하여 데이터들을 저장하고, 각 노드가 다음 노드를 가리키도록 한다.첫 노드의 주소만 알고 있으면 그 이후의 모든 노드에 접근할 수 있다.StackLIFO(Last-in First-out)단방향 Linked List를 사용하여 구현할 수 있다.head를 사용하여 스택을 간단하게 구현할 수 있다.데이터 삽입을 무조건 첫 번째 인덱스에 수행한다.QueueFIFO(First-in First-out)양방향 Linked List를 사용하여 구현할 수 있다.Deque데이터의 삽입과 제거를 head와 tail에서 자유롭게 할 수 있는 자료구조Hash TableHash Function해시 함수는 키(key)를 입력받아 해당 키의 저장 위치(버킷 또는 인덱스)를 결정하는 계산을 하는 함수좋은 해시 함수 ⇒ 데이터를 골고루 분배시켜주는 함수 Hash Collision해시 충돌은 해시 함수가 서로 다른 두 개 이상의 입력 값에 대해 동일한 해시 값을 출력하는 상황을 의미Hash 충돌이 발생한 곳의 Value들을 연결리스트로 구성하여 데이터들을 연결한다.기존값과 새로운 값을 동시에 저장할 수 있다.찾고자 하는 Value가 나올 때까지 연결리스트를 탐색한다.→ O(n)의 성능을 갖는다.Set데이터의 중복을 허용하지 않는 자료구조HashTable을 사용하여 구현할 수 있다.→ HashTable을 사용하기 때문에 HashSet이라고도 한다.→ HashTable의 value 값은 사용하지 않고 key만 사용하여 구현한다.(key가 key와 value의 역할을 수행한다.)그림으로 쉽게 배우는 운영체제OS가 하는 일프로세스 관리 : 여러 개의 프로그램들을 동시에 수행할 수 있게 한다.메모리 관리 : 모든 프로그램은 메모리에 올라가서 동작한다.H/W 관리 : 사용자가 직접 H/W에 접근하는 것을 막는다.File System 관리Program저장장치에 저장된 명령문의 집합체저장 장치만 사용하는 수동적인 존재Process실행중인 프로그램저장장치에 저장된 프로그램이 메모리에 올라갔을 대 프로세스라고 한다.메모리, CPU, I/O 작업을 수행하는 능동적인 존재Multi-Programming메모리 관점메모리에 여러개의 프로세스가 올라온 상태Multi-ProcessingCPU 관점CPU가 여러 개의 프로세스를 처리하는 것을 의미PCB(Process Control Block)프로세스가 만들어지면 운영체제는 해당 프로세스의 정보를 갖고 있는 PCB를 만들고 저장한다.PCB들은 연결 리스트로 저장된다.운영체제는 프로세스가 종료되면 연결리스트에서 해당 프로세스의 PCB를 제거한다.Context Switching프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스의 상태를 저장하고, 다른 프로세스의 상태값으로 전환하는 작업작업 과정에서 PCB의 내용(프로세스 상태, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보 등)이 변경된다.Process의 생성OS가 부팅되고 0번 프로세스가 생성될 때 딱 한 번만 수행된다.→ 그 이후에 생성되는 프로세스는 fork()를 사용하여 복사해서 사용된다.→ 새로 생성하는 것보다 복사를 하는 것이 더 빠르기 때문좀비 프로세스부모 프로세스가 자식 프로세스보다 먼저 종료되거나 자식 프로세스가 비정상적으로 종료돼 exit()신호를 주지 못해서 Exit Status를 읽지 못해 메모리에 계속 살아있는 상태Thread프로세스 내에 존재하고, 1개 이상이 존재할 수 있다.하나의 프로세스 내에 있는 쓰레드들은 프로세스의 PCB, Code, Data, Heap 영역을 공유한다.Stack은 공유하지 않고, 쓰레드 마다 하나씩 갖고 있다.OS에서 작업을 처리하는 단위이다.Process vs Thread안정성Process는 독립적이기 때문에 서로 영향을 받지 않는다.Thread는 하나의 Process를 공유하기 때문에 하나의 Thread에 이상이 생기면 다른 Thread에도 이상이 전파될 수 있다.⇒ Process가 유리속도와 자원각각의 Process는 서로 고유한 자원을 갖는다.코드, 데이터, 힙, 스택 영역을 전부 따로 두고 있다.Process간에 통신을 하려면 IPC를 사용해야 해서 오버헤드가 크고 속도가 느리다.쓰레드는 하나의 Process의 자원을 스택 영역을 제외한 영역을 모두 공유하기 때문에 오버헤드가 느리다.CPU Scheduling목표목표들을 전부 만족할 수는 없다.→ 목표들에 따라 Trade-Off가 있기 때문ex) 처리량 ↑ ⇒ CPU 오래 할당, 응답시간 ↓ ⇒ 여러 프로세스에 CPU를 골고루 할당⇒ 처리량과 응답시간 사이에 Trade-Off가 발생한다.리소스 사용률CPU 사용률 높이기I/O 디바이스의 사용률 높이기오버헤드의 최소화Context Switching시에 발생하는 오버헤드를 최소화하는 것공평성모든 프로세스에게 우선순위에 따라 공평하게 CPU가 할당되어야 한다.처리량같은 시간내에 더 많은 처리를 할 수 있게 하는 것대기시간작업을 요청하고 실제 작업이 실행되기 전까지 대기하는 시간이 짧은 것응답시간사용자의 요청이 얼마나 빨리 요청하는지Retrospect아쉬운 점커리큘럼을 잘못 봐서 운영체제 쪽은 쉬는 날에 몰아서 들었다.커리큘럼을 명확하게 파악하고 당일에 들을 강의들을 정확히 정리해야겠다.잘한 점매일매일 빠지지 않고 강의를 들은 점매일 들은 강의 내용을 요약/정리하고 그 주차의 내용들을 하나의 게시글로 정리한 것

알고리즘 · 자료구조워밍업클럽CS전공지식Week1

송지우

[공부기간 이틀]정보처리기사 실기 합격 후기

1. 본인 기본 정보학력: 컴퓨터공학과(AI파는 중..) 지방 사립 4년, 4학년 재학 중필기 시험 점수: 65점(정기기사 1회차)필기 시험 공부 방법: 1주 CBT 2번 돌돌..당시 보유 자격증: 리눅스 마스터 1급, 네트워크 관리사 2급, ADsP, SQLD, 빅분기 필기 등.. 2. 강의 발견4학년이 되다 보니 졸업 프로젝트에 저는 추가로 대학원 준비까지 있어 많이 바빴네요. 정신 차려보니 시험은 한 3일 정도 남았었습니다.... 사실 바쁜건 아니고 게을렀어요. 그래서 정처기 솔직히 포기할까 했는데 컴공인데 정처기 없는 것도 좀 그렇고 인프런 강의 둘러 보다가 [주말 코딩]님의 "일주일만에 합격하는 정보처리기사 실기"라는 강의가 있더라구요.강의 링크: https://u.inf.run/3Bu7c2O강의 시간도 보니까 19시간으로 1.5배속 + 잠 안자면 충분히 가능할 것 같아서 일단 결제 했습니다. 믿고 듣는 인프런이라.. 3. 공부 방법일단 달려야 하니까 조금 자고.. 26일 저녁부터 달렸습니다. 강의를 보면 섹션이 10개가 있어요. 중요하게 들었던 거랑 좀 대충 들었던 거 알려드리겠습니다.섹션1은 정처기 설명이니까 2배속.섹션2도 전체적인 설명이지만 문법이라 1.4배속으로 정독(중요)섹션3, 4: C언어는 보통 전자과에서 많이 쓰고 자바는 백엔드 하는 애들 빼곤 잘 안하거든요. 저는 컴공에 AI파고 있어서 C언어는 가물가물하고 자바는 잘 몰라요. 그래서 여기는 1.4 배속으로 열심히 들었습니다.섹션5: 파이썬: 저는 파이썬이 주 언어라 그냥 2배속했는데 잘 모르시면 1.4배속으로 정독하시길 바래요. 이번에 print문에서 f스트링 부분을 많이 틀리신 것 같은데 아마 설명 추가됐을겁니다.색션6: 저는 이거 union이라든가 좀 중요하다고 생각하거든요. 그래서 1.4배속으로 꼼꼼히 들었어요솔직히 여기까지만 들어도 이번 실기 문제 푸는건 괜찮았고 괜찮으실거에요. 근데 시간이 좀 남아서 그냥 다 들어보았습니다.색션7(기출): 코드 문제는 솔직히 자바 업캐스팅이랑 C언어 포인터 말고 다시 나오는 것이 힘들다고 생각해서 저거 두 개만 유심히 보고 나머진 2배속으로 아~ 그렇구나 했습니다.색션8: 자바에서 this랑 super부분 조금 열심히 봤고색션9 - 10: 여기는 처음보면 틀리는게 100퍼라 그냥 아~ 그렇구나 하고 대충 훑었습니다.딱 여기까지 다 보니까 7월 28일(시험당일) 새벽 2시더라구요. 그래서 자고 시험 보러 갔습니다.아! SQL문법은 섹션 10에 나온 기출 꼭 보고 가세요. 점수를 꽁으로 얻는 방법..입니다..수료증 보시면 알겠지만 시험 당일에서야 모두 수강한 것을 알 수 있습니다... 4. 합격덕분에 코딩은 다 맞았고, 개념쓰는 몇개를 틀렸는데(이거 기출문제에 좀 있었다네요) 기출 개념 좀 훑었으면 85-95 나오지 않을까 싶습니다. 아 그리고 RIP가 나왔는데 이건 리눅스 마스터 때 기억으로 풀었습니다. 근데 문제가 쉬워서 개념을 몰랐어도 최소경로를 쓰느냐, 최소 노드수로 쓰느냐로 찍었으면 50% 확률로 맞을 수 있는 문제같아요. 5. 후기기본정보에도 보시면 알겠지만 학력이 뛰어나진 않고 단순히 학과 이름만 전공자일 뿐입니다.(개발이 아니라 AI 하니까요.) 그러니까 다른 분들도 충분히 시간 투자하면 합격할 수 있다고 생각해요.강의평: 들을만하다. 충분히 돈값을한다. 전공자가 들으면 무적이다. 주기적으로 업데이트 되는 강의라 더 좋다. 이 글은 내돈내산으로 작성되었음 

개발 · 프로그래밍 자격증정처기정보처리기사정기기사정처기실기정보처리기사실기정기기사실기

빠타박스

[(Daily 빠타박스)인프런 워밍업 클럽 2기] - CS 전공지식을 시작하는 글_1일차

인프런 워밍업 클럽 CS얼마전 본 면접에 나는 그냥 딱히 신경 쓰지 않았다. 나의 실력이 이정도구나..이런 질문에 이런 것 밖에 답변을 하지 못하는구나. 너무 준비되지 못했고 기초가 부족하다 느꼈다... 그러다 우연치 않게 보게된 워밍업 클럽 처음엔 무료인줄 알았다..그러나 스터디 그룹에 초대되고 그런 과정이 무료라는 것이지 절대 세상에 무료라는 것은 없다. 그냥 40% 할인권을 주었고그것으로 구매하여 저렴하게 강의를 수강할 수 있었다. 감자라는 강의자 분은 정말 퀄리티 좋은 강의를 올리시고 계신다는 것을 일단 동영상에 노력이 어마어마 하게 들어갔음을 알 수 있었다. 감자강의자님 로드맵 CS일단 강의 자체는 좋아보였고, 리뷰도 정말 좋게 쓰여져 있다. 솔직히 믿을만 한가. 싶기도 했지만. 나는 좀 인강 스타일이 까다롭게 잘 안맞아서... 이 30대에 듣는 인강을 신중히 고르는 편이였다. 리뷰 내용도 일단 보고 고민을 많이했다. 널널한개발자 님의 강의를 볼지 이것을 할 지 그러나 그냥 해보자 싶었다.강의 커리큘럼을 비교해 보면서 들어오게 되었고,11월 1일 까지 마감이라. 딱 마침 내가 다시 학원에 가게 될 시기랑 겹치지 않아서.(갈지 안갈지 지금 쓰는 시점에서 아직 정하지는 않았다만..) 그렇게 초대된 디스코드를 통해서 OT도 진행하였고, 확실히 제대로 진행하는 스터디 클럽인 만큼 신중히 잘 하는 것 같았다.시간표도 주어지고 준비가 되어있는 듯 했다. 약 한달간의 커리큘럼과정이였으나.이것이 어쨋든 자기주도학습의 일환이다. 우리가 들어야 한다. 정보를 제공해주었으니. 그래서 시작해본다.내 스스로의 위치에서 발전할 수 있기를 어디서나 중요한건 복습이다. 복습되지 않으면 쉽지 않을 수 있다.내가 간과하는 것이 그런것이다. 반복학습을 싫어하기에. 힘들어한다.하지만 해야하만 한다... 한번 진행해보자... 9월 30일을 기점으로 1일차가 시작되고 그것을 해내기 위해 글을 써본다.또한 정보처리기사 실기가 잡혀있는데. 병행해서 해야만한다.

컴퓨터 구조인프런워밍업클럽스터디모임감자빠타박스언리얼엔진CS지식CS게임개발자

마소캠퍼스

Gen AI 인사이트[Gen AI 인사이트] 생성형 AI, ChatGPT를 내게 딱 맞게

똑똑하게 업무를 처리하는 방법, 마소캠퍼스가 알려드릴게요!최신 AI 기술로 더욱 효율적이고 스마트하게 일해보세요.ChatGPT를 사용하는 방법도 한 단계 더 진화했어요. 이제 ‘Custom Instructions’로 나만의 맞춤형 AI를 만들어보세요!이 기능을 통해 ChatGPT에 원하는 스타일과 방향을 명확히 지시할 수 있어요.업무 속도와 효율성을 높일 절호의 기회랍니다.‘생성형 AI’는 데이터를 입력받아 텍스트나 이미지를 만들어내는 기술이에요.ChatGPT 같은 생성형 AI는 대화뿐만 아니라 콘텐츠 제작, 아이디어 브레인스토밍까지 다양한 방식으로 활용할 수 있답니다.여러분의 업무와 일상에 새로운 가능성을 열어줄 거예요! Custom Instructions는 ChatGPT를 커스터마이징할 수 있는 도구예요.어떤 정보를 제공할지, 그리고 응답 스타일을 어떻게 설정할지를 지정하면 AI가 더 개인화된 대답을 제공해요.예를 들어, 짧고 간결한 응답이 필요한 경우에도 완벽히 대응할 수 있죠!Custom Instructions는 두 가지로 구성돼요!1. 사용자 정보 및 목표 설정 – 관심사, 목표 등을 입력하면 AI가 더 나를 이해하게 돼요.2. 응답 방식 지정 – 톤, 길이, 형식 등을 설정해 내가 원하는 스타일의 응답을 받을 수 있답니다.예를 들어 ‘캐주얼하고 간단하게 말해줘!’라는 요청도 가능하죠.여러분의 관심사나 목표를 입력하면 ChatGPT는 더 개인화된 도움을 줄 수 있어요.– 예시 1: 업무 스타일에 맞는 생산성 팁 제공– 예시 2: 취미에 적합한 콘텐츠 추천맞춤화된 설정으로 내 삶과 업무를 업그레이드해 보세요! 내가 원하는 말투와 정보를 정확히 전달받기 위해서는 어떻게 요청할지를 명확히 설정해야 해요.예를 들어, 다음을 고려해보세요:– 공식적: 비즈니스 문서 작성 시– 짧고 간결하게: 메모나 아이디어 정리 시– 캐주얼: 친구와의 대화처럼 가볍게 맞춤 설정을 통해 AI를 더 똑똑하게 활용해 보세요.Custom Instructions로 ChatGPT를 다양하게 활용할 수 있어요.– 업무 문서 작성 간소화– 관심사 기반 새로운 아이디어 생성– 프로젝트 소개문 작성Custom Instructions로 랜딩 스토리 작성, 프로젝트 브레인스토밍, 문서화 과정 효율화까지!여러분의 창의적 아이디어를 마음껏 펼칠 수 있는 새로운 방법이에요.AI와 함께 더 나은 결과를 만들어보세요!AI는 여러분의 작업 스타일을 학습해 빠르고 정확한 맞춤형 응답을 제공합니다.초기 설정이 조금 필요하지만 꾸준히 활용하면 마치 나만의 비서처럼 효율적인 도구로 사용할 수 있어요!마소캠퍼스와 함께 AI를 활용해 업무 혁신을 이뤄보세요!마소캠퍼스와 함께 AI를 활용해 업무 혁신을 이뤄보세요!효율적이고 스마트한 일의 방식을 통해 성장할 수 있도록 도와드릴게요. 📌관련 강의<ChatGPT 전략적 활용법 - 리더를 위한 생성형 AI 비즈니스 전략 과정>탁월한 비즈니스 성과를 위한 최상의 선택 불필요한 시간 낭비는 이제 그만!

aigptchatgpt챗gpt업무혁신비즈니스리더십인공지능스마트생성ai

강지원

[인프런 워밍업 스터디 클럽 2기 FE] 강지원 1주차 발자국

따라하며 배우는 자바스크립트 A~Z (1~7강) Day 1 (OT)프론트엔드가 꼭 알아야 하는 기술들과 포트폴리오를 만들 때는 어떤 프로젝트 위주로 넣는 것이 좋은지 알 수 있었다. 도움이 되는 정보를 많이 주셔서 좋았고 스터디도 기대가 됐다.오티 때 가졌던 마음 가짐 그대로 완주까지 열심히 할 수 있으면 좋겠다. Day 2 (자바스크립트 기초)변수의 참조 범위 * var : 함수 레벨 스코프 * 함수 내에서 선언된 변수는 함수 내에서만 유효 * 함수 외부에서 참조할 수 없음 * let, const : 블록 레벨 스코프호이스팅 * var * 호이스팅이 됨 (선언 당시에 undefined을 할당) * 이후 할당 되었을 때 hello라는 값이 들어감 * 초기화 되기 전에 값을 사용할 수 있음 * let, const * 호이스팅은 되지만 초기화 되기 전에 어떤 값도 할당해주지 않음 * TDZ : Temporal Dead Zone (변수를 사용할 수 없는 일시적인 비활성 상태) * TDZ가 존재하기 때문에 초기화 되기 전에 값을 사용할 수 없음 DOM * 웹 페이지 빌드 과정 (Critical Rendering Path - CRP) * html 분석 -> dom tree 생성 -> css dom tree 생성 -> 합쳐서 렌더링 트리 생성 * -> 레이아웃 단계 : 배치할 요소의 위치와 크기를 계산 -> Paint : 실제로 그려짐 * 렌더링 트리 생성, 위치 계산과 그리는 단계의 비용이 큼 * 리액트는 이러한 부분의 성능을 개선하기 위해 virtual DOM을 이용함이벤트 * 비동기 작업인 setTimeout은 WebAPI에서 처리해줌 * setTimeout이 일정 초를 기다리면 콜백 큐로 함수가 이동함 * 비동기 작업이 Callback Queue에 쌓이고 * 이벤트 loop는 콜스택과 콜백큐를 모두 주시하고 있다가 * 콜스택이 비게 되면 콜백큐에서 하나씩 꺼내서 콜스택에 넣어줌 이벤트 버블링, 이벤트 캡쳐링 * 이벤트의 흐름은 3단계를 거치게 됨 * 1. 캡처링 단계 - 이벤트가 하위 요소로 전파되는 단계 * 2. 타깃 단계 - 이벤트가 실제 타깃 요소에 전달되는 단계 * 3. 버블링 단계 - 이벤트가 상위 요소로 전파되는 단계 * 이벤트 버블링 * 가장 깊게 중첩된 요소에 이벤트가 발생했을 때 이벤트가 위로 전달되는 것 * 위로 전달되면서 상위 요소의 event handler가 차례로 실행됨 * 이벤트 캡쳐링 * 이벤트가 위에서 아래로 내려가는 것 Day 3 (자바스크립트 중급 1)this * this * 메소드(객체안에 있는 함수)에서 this 사용 => 해당 객체를 가리킴(참조) * 함수에서 this 사용 => window 객체를 가리킴 * strict 모드에서는 함수에서 this 사용 => undefined을 가리킴 * constructor 함수에서 this 사용 => 빈 객체를 가리킴 // 화살표 함수 this => 항상 상위 scope의 this // Lexical this const my_audio = { title: "audio", categories: ["rock", "pop", "hiphop"], displayCategories() { // 여기서 this는 이 객체를 가리킴 this.categories.forEach((category) => { // 여기서 this는 상위 scope에 있는 this를 가리킴. 즉, 이 객체 console.log(`title: ${this.title} category: ${category}`); }); }, }; * forEach의 두번째 매개변수 => thisArg * 콜백 함수에서 this로 참조할 수 있게 됨 const my_audio2 = { title: "audio", categories: ["rock", "pop", "hiphop"], displayCategories() { this.categories.forEach( function (category) { // 이 this는 함수안에 있기 때문에 window를 가리킴 console.log(`title: ${this.title} category: ${category}`); }, { title: "audio" } // 두번째 매개 변수를 작성하게 되면 this가 이 object를 가리킴 // this // 여기에 this를 작성하게 되면 이 this는 메소드 안에 있는 것이 됨. 따라서 이 객체를 참조함 ); }, };closure // 예시 함수 function outerFunction(outerVariable) { return function innerFunction(innerVariable) { console.log("Outer Variable: " + outerVariable); console.log("Inner Variable: " + innerVariable); }; } const newFunction = outerFunction("outside"); newFunction("inside"); * 순서 * 1. outerFunction("outside")는 newFunction에 할당되는 즉시 호출됨 * 2. 호출되면 newFunction에는 innerFunction(innerVariable)이 할당됨 * 3. newFunction("inside")을 호출하면 innerFunction("inside")이 호출되고 이때 클로저는 innerFunction이 outerVariable이 "outside"였다는 것을 기억하고 엑세스 할 수 있다는 것을 말함 * Closure 정리 * 다른 함수 내부에 정의된 함수가 있는 경우 외부 함수가 실행을 완료하고 * 해당 변수가 해당 함수 외부에서 더 이상 엑세스할 수 없는 경우에도 * 해당 내부 함수는 외부 함수의 변수 및 범위에 엑세스할 수 있다.this와 closure는 어렴풋이 이해만 하고 막상 설명을 하려고 하면 말이 잘 안나오던 개념이었다. 강의를 2, 3번 반복해서 듣고 다른 자료도 같이 찾아보면서 공부했더니 이번 기회에 확실히 설명할 수 있을 정도로 이해할 수 있었다. 뿌듯하다. Day 4 (자바스크립트 중급 2)undefined vs null* 공통점 * 둘 다 원시 자료형, 각 타입(undefined, null)에서 각 값이 유일함 * undefined * 아무 값도 할당받지 않은 상태 * js 엔진이 변수를 초기화하기 위한 용도 * 개발자가 의도적으로 값이 없음을 표현하고 싶다면 null이 적절함 * null * 비어있는, 존재하지 않는 값을 의미 * null이 할당 되면 가비지 콜렉션이 수행됨얕은 비교 vs 깊은 비교* 얕은 비교 * 원시 자료형 -> 값을 비교 * 참조 자료형 -> 참조되는 위치 비교 * 깊은 비교 * 원시, 참조 자료형 -> 값을 비교얕은 복사, 얕은 동결 vs 깊은 복사, 깊은 동결* 얕은 복사 * Object.assign(target, source), spread operator * 첫번째 depth 즉, 얕은 부분만 복사가 되기 때문에 얕은 복사 * 얕은 동결 * Object.freeze(object) * 역시 얕은 동결이기 때문에 깊은 곳은 동결이 일어나지 않음 * 깊은 복사 * JSON.parse(JSON.stringify()) * spread operator : 얕은 복사를 여러번 반복하는 것과 동일한 효과 * structuredClone() * deep copy는 주로 lodash, Ramda등 라이브러리를 이용함함수 선언문 vs 함수 표현식* 함수 선언문은 호이스팅 영향 o * 함수 표현식은 호이스팅 영향 xIIFE (Immediately Invoked Function Expression)* 정의되자마자 즉시 실행되는 함수 * 형태 ( // 첫 번째 소괄호 -> 전역 선언을 막고, 함수 내부로 다른 변수 접근을 막음 function () { // Do Something... } )() // 두 번째 소괄호 -> IIFE를 생성하는 괄호 * 목적 * 전역 선언을 막고, 함수 내부로 다른 변수 접근을 막기 위함 * 이름 없는 함수를 만들기 위해 사용 * 연산자를 붙여서도 사용 가능하지만 화살표 함수는 (를 꼭 붙여야함Pure Function* 함수형 프로그래밍 패러다임의 한 부분 * 규칙 * 1. 같은 입력 값이 주어졌을 때, 언제나 같은 결과 값을 리턴함 * 2. 사이드 이펙트를 만들지 않음 (외부 상태에 영향을 받으면 안됨) * 사용하는 이유 * 1. 클린 코드를 위해서 * 2. 테스트를 쉽게 하기 위해서 * 3. 디버그를 쉽게 하기 위해서 * 4. 독립적인 코드를 위해서 (decoupled / independent) * 장점 * 1. 특정 함수가 다른 함수에 미치는 예기치 못한 영향을 최소화 * 2. 함수가 어떤 결과 값을 리턴할지 예측할 수 있음currying// curring function // static (매개 변수를 동적으로 늘리지 못함) function curry(f) { return function (a) { return function (b) { return function (c) { return f(a)(b)(c); }; }; }; } // dynamic // 매개 변수가 몇개든 curry로 바꿔줄 수 있음 function curry2(func) { return function curried(...args) { if (args.length >= func.length) { return func.apply(this, args); } else { return function (...args2) { return curried.apply(this, args.concat(args2)); }; } }; } Day 5 (OOP, 비동기)prototype* prototype * 자바스크립트 객체가 다른 객체로부터 메서드와 속성을 상속 받는 메커니즘 * prototype chain이라고도 함 * 더 적은 메모리, 코드 재사용성 증가 * 반복해서 사용되는 메소드가 있다면 prototype에 넣어주는 것이 좋음 * ObjectName.prototype.mathodName = ~~ * Object.create(함수 이름) // 사용 예시 function Person(name, email, birthday) { const person = Object.create(personPrototype); person.name = name; person.email = email; person.birthday = birthday; return person; } const personPrototype = { calculateAge() { const diff = Date.new() - this.birthday.getTime(); const ageDate = new Date(diff); return Math.abs(ageDate.getUTCFullYear() - 1970); }, }; ES6 class* 문법은 OOP방식을 이용하지만 내부에서는 prototype을 사용하여 작동 * 메소드가 자동으로 prototype에 들어감 * static을 사용하면 prototype에 들어가지 않고 constructor에 들어감 * 사용할 때는 인스턴스가 아닌 class 이름을 이용해서 사용해야 함 * static을 사용하는 경우 * 클래스의 필드를 사용하지 않는 독립적인 것을 생성할 때 사용 super* super * 부모 클래스의 생성자를 호출할 때 사용 * 부모 클래스의 메소드를 호출할 때 사용 CallBack, Promise, Async Await* JS는 싱글스레드 : 한번에 하나의 일 밖에 못함 * 비동기를 사용하면 병렬적으로 작업을 수행할 수 있음 * 비동기 작업이 어떠한 비동기 작업을 의존하고 있을 경우 * -> CallBack, Promise, Async Await을 사용해서 처리할 수 있음 * Callback * 단점 * 1. 가독성이 떨어짐 * 2. 모든 콜백에서 각각 에러 핸들링을 해줘야 함 * Promise (ES6) * 3가지의 상태로 나뉨 * pending(대기) : 비동기 로직을 처리 중인 상태 * fulfilled : 처리가 완료되어 결과값을 반환한 상태 * rejected : 비동기 처리가 실패하거나 오류가 발생한 상태 * Promise.all([]) : 배열 안에 있는 모든 작업이 fulfilled 상태가 되어야 성공으로 침 * 하나라도 rejected될 경우 첫 번째로 실패한 작업의 이유가 반환됨 * Promise.race([]) : Promise * 배열 안에 있는 작업 중 가장 먼저 완료된 것의 결과 값을 그대로 이행하거나 거부 * Async Await (ES7) * 비동기 요청을 동기식으로 작성 가능하게 해줌 * 가독성이 좋음  일주일 회고단순한 JS 문법이 아닌 내부에서 JS가 어떻게 동작하는지, 개념의 정확한 설명이 무엇인지 등을 깊게 공부할 수 있던 시간이었습니다.제가 JS의 어떤 부분이 부족한지 뼈저리게 느낄 수 있었고, 앞으로 더 성장할 수 있다는 생각으로 열심히 공부해보려고 합니다.강의를 수동적으로 듣지 않고 코드도 작성해보고 추가적으로 궁금한 부분을 찾아보면서 능동적으로 공부했더니 더 머리에 잘 남은 것 같습니다.앞으로의 스터디도 능동적으로 참여해서 강의 내용을 제 것으로 만드는 것이 목표입니다.과제를 만들면서 js에 대한 이해도가 정말 많이 높아진 것이 스스로 느껴집니다. 아쉬운 점스터디 첫 주이다 보니 정말 기억하고 싶은 부분만 작성을 해두었는데도 내용이 너무 길어진 것 같아 아쉽습니다.2주차부터는 조금 더 가독성 있는 회고를 작성하고 싶습니다. 강의 출처강의 주소 : https://www.inflearn.com/course/따라하며-배우는-자바스크립트/코치님 성함 : John Ahn 

JS인프런스터디프론트엔드1주차

데이터베이스 관련 학습 내용 정리

예전에 공부했었던 데이터베이스 정규화와 관련해서 제 나름대로 정리해본 내용입니다.제1정규형정의: 한 레코드의 각 칼럼들에 담긴 값은 원자값들만 담긴다.맥락이 부분이 정확히 왜 제시되었는지 아직도 적확하게 결론짓지는 못했습니다.하지만 제 나름대로 관련해서 이해한 방식은 "모든 칼럼들의 집합은 슈퍼키이다" 입니다.따라서 제1정규형을 만족한다면 슈퍼키의 존재성을 가정해도 되어서, 다른 정규형들을 설명할 때의 논리적인 기반이 되는 것 같습니다.제3정규형 (수정: 논리적으로 잘못 이해한 부분이 있어 수정하였습니다. 정리 안 했으면 지나칠 뻔 했습니다.)정의: 다음 조건을 만족하면 제3정규형 위반이행적 종속성 A -> B -> C가 발생하는데,A -> B가 일대일 대응이 아니여서 칼럼 C의 값이 중복해서 들어가고,원래 테이블 ABC를 AB와 BC로 분리했을 때 후보키가 바뀌는 일이 일어나지 않는다.C가 후보 키의 일부인 경우 분리를 못하는 경우가 있습니다. (예: AC -> B, B -> C)이 부분을 설명하기 위해 prime attribute이라는 개념을 사용하는 것 같습니다.맥락정리하고 보니 핵심적인 부분이 바로 칼럼 간의 의존관계인 것 같습니다.데이터 모델링을 할 때, 각 칼럼이 어떤 칼럼들에 의존하는지 파악하는 연습을 하기로 생각했습니다.제2정규형정의: 제3정규형 조건에서 B가 후보키의 일부일 때가 제2정규형의 조건이 됩니다.즉, 앞의 A -> B가 일대일 대응이 아닌 경우입니다.사용한 용어들입니다.슈퍼키: 레코드를 유일하게 결정지을 수 있는 칼럼들의 집합후보 키: minimal 슈퍼키. 후보 키 자체는 슈퍼키인데, 후보 키에서 칼럼을 하나라도 제외하면 레코드를 유일하게 결정지을 수 없다.기본 키 (PK): 후보키 중 사람이 DBMS 관리를 위해 고른 것 2024-11-10수정: 인프런 데이터베이스 강의 소개 영상을 보는데 실무에서의 RDBMS 설계는 이론과 괴리가 있다는 사실이 약간 충격이었습니다.최근에 어떤 블로그 글을 보는데 비즈니스 로직이 실제로 블로그에 나오는 식의 명세로 작성되고, 데이터베이스 스키마로 옮겨진다는 것을 확인하였습니다. (그리고 DDD라는 개념이 무엇인지 궁금해졌습니다.)업데이트: 다시 읽어보는데, 엔티티 관계 다이어그램으로 일차적으로 옮겨지고 그 다음 데이터 모델링이 진행되는 것으로 해석하였습니다.수정: 데이터베이스 강의 소개 영상을 보니 실무에서는 기획에서 나온 화면의 데이터를 바탕으로 진행하는 경우가 더 많다는 것을 알았습니다. 간단한 프로젝트를 천천히 진행해보면서 여기의 내용과 유사하게 진행해보아야겠습니다.수정: 천천히 진행해보려 했는데, 간단한 프로젝트의 데이터베이스 스키마의 복잡도가 실제 포트폴리오의 스키마에 미치지 못할 수 있겠다는 생각이 들었습니다. 그 경우를 대비해서 최대한 빠르게 스키마 설계를 해보고 잘 되는지 확인해보아야겠습니다.업데이트: 일단은 다음 방법이 저에게 효과가 있는 것 같습니다. 더 복잡한 테이블 설계에서도 적용 가능한지 확인해보아야겠습니다.비즈니스 로직에 대한 명세를 만든다. (상황에 따라 테이블 설계하면서 동시적으로 진행)제일 개념들이 많이 들어가는 구체적인 명세들을 먼저 고른다.명세들을 잘 표현하는 테이블 구조를 설계한다.제3정규형을 지키도록 ~~리팩토링~~데이터 모델링을 한다.

데이터베이스

쿠버네티스(EKS)에서 Sentry 배포하기

Datadog과 New Relic과 같은 툴은 종합적인 모니터링을 제공하지만 비용이 많이 들 수 있습니다. Bugsnag은 Sentry와 유사하지만, Sentry는 특히 클라이언트 오류 추적과 성능 모니터링에서 뛰어나며, 저비용의 오류 추적과 알림을 위해 Kubernetes에 배포하기에 적합합니다.K8s에서 효율적인 모니터링Loki: 서버 로그를 관리하고 Grafana로 쉽게 시각화할 수 있습니다.Prometheus: 애플리케이션과 서버 성능 모니터링에 사용됩니다.Grafana: Prometheus와 Loki 메트릭을 통합하여 비용을 절감하면서 CloudWatch 로깅을 최소화합니다.Sentry: 저비용의 클라이언트 측 오류 모니터링을 위해 사용하며, Slack 또는 이메일로 알림을 전송합니다.이 구성은 비싼 상용 도구를 사용하지 않고도 K8s에서 효율적인 인프라 및 애플리케이션 모니터링을 제공합니다.이 가이드에서는 Amazon EFS를 사용한 지속 가능한 저장소 설정, Sentry 구성, 그리고 Express.js 애플리케이션과의 통합을 포함한 Sentry를 Kubernetes(EKS)에 배포하고 테스트하는 과정을 설명합니다. 1. Sentry Helm 리포지토리 추가먼저, Sentry Helm 리포지토리를 추가하고 Sentry 네임스페이스를 생성합니다.bash코드 복사helm repo add sentry https://sentry-kubernetes.github.io/charts helm repo update kubectl create ns sentry 2. EFS 스토리지 클래스 생성Sentry의 저장소를 설정하기 위해 Amazon EFS를 사용할 것입니다.2.1 EFS CSI 드라이버 설치먼저, Amazon EFS와 상호 작용할 수 있도록 EFS CSI 드라이버를 설치합니다.helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/ helm repo update helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \ --namespace kube-system \ --set image.repository=602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/eks/aws-efs-csi-driver \ --set controller.serviceAccount.create=true \ --set controller.serviceAccount.name=efs-csi-controller-sa 2.2 PersistentVolume 및 PersistentVolumeClaim 생성파일 시스템 ID 가져오기file_system_id=$(aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text) echo $file_system_idPersistentVolume 정의 및 적용efs-pv를 사용하여 EFS와 연결되는 PersistentVolume(PV)을 생성합니다.specs/pv.yaml:apiVersion: v1 kind: PersistentVolume metadata: name: efs-pv spec: capacity: storage: 100Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: efs-sc csi: driver: efs.csi.aws.com volumeHandle: $file_system_id PV 적용:kubectl apply -f specs/pv.yamlPersistentVolumeClaim 정의 및 적용efs-claim을 사용하여 PV를 사용할 PersistentVolumeClaim(PVC)을 생성합니다.claim.yaml:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: efs-claim spec: accessModes: - ReadWriteMany storageClassName: efs-sc resources: requests: storage: 5Gi PVC 적용:kubectl apply -f claim.yaml -n sentry 2.3 StorageClass 정의 및 적용Amazon EFS를 위한 StorageClass를 정의합니다.specs/storageclass.yaml:kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: efs-sc provisioner: efs.csi.aws.com StorageClass 적용:kubectl apply -f specs/storageclass.yaml 3. Sentry 배포를 위한 값 업데이트Sentry의 기본 설정 값을 가져와서 배포에 맞게 업데이트합니다.기본 values.yaml 가져오기helm show values sentry/sentry --version 25.10.0 > values.yaml values.yaml에 필요한 구성 업데이트:user: create: true email: admin@sentry.local password: XXXXX system: url: "https://sentry.topzone.io/" adminEmail: "devops@topzone.io" mail: backend: smtp useTls: true useSsl: false username: "XXXXX" password: "XXXXX" port: 587 host: "email-smtp.ap-northeast-2.amazonaws.com" from: "devops@topzone.io" symbolicator: enabled: true api: usedeployment: true persistence: enabled: true accessModes: ["ReadWriteMany"] storageClassName: "efs-sc" google: clientId: "XXXXX" clientSecret: "XXXXX" slack: clientId: XXXXX clientSecret: XXXXX signingSecret: XXXXX nginx: enabled: false ingress: enabled: true regexPathStyle: nginx ingressClassName: nginx alb: httpRedirect: false annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: "true" cert-manager.io/cluster-issuer: "letsencrypt-prod" nginx.ingress.kubernetes.io/proxy-body-size: 200m nginx.ingress.kubernetes.io/proxy-buffers-number: "16" nginx.ingress.kubernetes.io/proxy-buffer-size: "32k" hostname: sentry.topzone.io tls: - hosts: - sentry.topzone.io secretName: sentry-ingress-tls filestore: backend: filesystem filesystem: path: /var/lib/sentry/files persistence: enabled: true storageClass: "efs-sc" accessMode: ReadWriteMany existingClaim: "sentry-data-pvc" persistentWorkers: true 4. Sentry 설치업데이트된 설정으로 Sentry를 Helm을 사용하여 설치합니다.helm upgrade --debug -install sentry sentry/sentry \ -n sentry -f values.yaml --wait --timeout=1000s --version 25.10.0 5. 설치 후: 새 프로젝트 설정Sentry를 설치한 후 애플리케이션 모니터링을 시작할 새로운 프로젝트를 생성합니다.5.1 Sentry에서 프로젝트 생성방문: https://sentry.topzone.io/organizations/topzone/projects/5.2 Express SDK 구성Express 애플리케이션에 Sentry를 통합하여 오류를 캡처합니다.npm install --save @sentry/node Sentry 설정 (src/instrument.js):const Sentry = require("@sentry/node"); Sentry.init({ dsn: "https://XXXXX@sentry.topzone.io/6", tracesSampleRate: 1.0, }); Express 애플리케이션에 오류 처리 추가 (src/app.js):require("./instrument.js"); const Sentry = require("@sentry/node"); const express = require("express"); const app = express(); Sentry.setupExpressErrorHandler(app); app.use(function onError(err, req, res, next) { res.statusCode = 500; res.end(res.sentry + "\n"); }); app.get("/", function rootHandler(req, res) { res.end("Hello world!"); }); app.get("/error", function rootHandler(req, res) { // 오류가 Sentry에 캡처됩니다. Sentry.captureException('Something went wrong!'); }); app.listen(3000); 6. 소스 맵 업로드더 나은 JavaScript 오류 가시성을 위해 Sentry에 소스 맵을 업로드합니다.curl -sL https://sentry.io/get-cli/ | sh sentry-cli --url https://sentry.topzone.io/ login npx @sentry/wizard@latest -i sourcemaps 7. Sentry 테스트마지막으로, Sentry가 애플리케이션의 오류를 캡처하는지 확인합니다.이 구성으로 EKS에서 Sentry를 사용하여 애플리케이션을 효과적으로 모니터링하고 디버깅할 수 있습니다.원문)https://www.linkedin.com/pulse/deploying-testing-sentry-kubernetes-eks-doohee-hong-em9sc/?trackingId=KrSiOLrQR6eWgOwtiEcyRg%3D%3D 

하얀종이개발자

Java 스터디 회고록 [김영한의 자바 입문편] with 성빈클럽

회고록 김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음 스터디2024년 10월 27일 → 2024년 11월 8일 목표김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음 강의를 진도에 맞게 듣고 인증각 섹션별 미션 문제를 수행하고 정리하여 공유  목표 수행 여부목표 1 : ✅목표 2 : ✅ Keep요즘 기본기를 튼튼히 하자!라는 방향으로 공부하고 있기때문에 전체 복습하자는 생각으로 스터디에 참여하게 되었습니다.사실 자바를 공부했었고, 실무에서도 사용했었기 때문에 자바를 처음부터 다시보는게 의미가 있을까하는 생각이 있었어요. 그래도 기본기를 복습하자라는 생각으로 꾸준히 진도에 맞게 학습하고, 미션을 모두 수행하다보니 조금은 애매하게 알고 있었던 지식들이 더 확실하게 정립될 수 있었던 것 같아요. 강의 내용 뿐만아니라 자바에 대해 궁금한 부분이 생기면 따로 찾아보기도 하면서 자바안에 수많은 고민들과 개념들이 녹아져 있다는 것을 느껴서 자바를 더 좋아하게 된 것 같기도 하네요.무튼 8일간의 시간동안 13시간의 진도인증 + 미션 풀이 + 공유를 모두 완주하게 되어 기쁘고 뿌듯합니다. Problem조금 제 자신에게 아쉬웠던 부분은 알고 있는 내용을 말로 혹은 글로 풀어서 정리할때 너무 길어지는게 있었던 것 같아요. 아는 것을 좀 더 핵심적으로 간추려서 정리하는 것을 계속 연습해야 할 것 같아요.그리고 스터디를 진행하면서 성빈님(스터디 장)이 직접 미션 문제를 내주시고 리뷰까지 해주시는 방식이 저한테는 매우 편하고 좋았지만 성빈님이 너무 고생하시기도 하고, 스터디원끼리 서로 내용에 대한 생각을 많이 공유하지 못한 부분이 조금 아쉬웠던 것 같기도해요. 빠듯한 일정이라 어쩔수 없기도 했지만요. Try다음 스터디는 자바 기본편 이어서 자바의 꽃인 객체지향 내용을 다루게 될 텐데, 좀 더 꼼꼼히 정리하면서 개념을 정립하고 싶어요. 그리고 스터디의 포맷도 변경될 수 있다고 하여 더 적극적으로 참여해서 저한테도 도움이되고 다른 분들께도 도움이 될 수 있도록 하겠습니다. 성빈님 특히 너무 고생많으셨고, 다른분들도 고생많으셨습니다. 여러모로 많이 배웠습니다.고급자바쟁이까지 끝까지 고고 !! 🙌

프로그래밍 언어김영한의자바입문코드로시작하는자바첫걸음자바스터디성빈클럽

마소캠퍼스

[Gen AI 인사이트] 업무 혁신의 열쇠, 생성형 AI로 스마트하게 일하기!

똑똑하게 업무를 처리하는 방법, 마소캠퍼스가 알려드릴게요!최신 AI 기술로 더욱 효율적이고 스마트하게 일해보세요.생성형 AI를 활용해 더 스마트하게 일할 수 있는 방법을 알아보세요! 복잡한 작업을 단순화하고, 빠르게 결과를 얻을 수 있답니다. AI가 업무 효율을 어떻게 높여줄지, 지금 시작해 보세요~생성형 AI는 텍스트나 이미지, 코드 등을 자동으로 생성해주는 인공지능 기술이에요. 데이터만 입력하면 다양한 형태의 결과물을 빠르게 만들어줍니다. 여러분의 아이디어가 곧바로 현실로!생성형 AI는 고객 서비스, 콘텐츠 제작, 데이터 분석 등에서 특히 효과가 뛰어나요. 반복적인 작업을 줄이고, 정확성을 높여주어 혁신을 이끌어내고 있죠!AI에게 원하는 결과를 얻으려면 정확하고 명확한 프롬프트 작성이 필수예요. 구체적인 지시와 목표를 설정해 원하는 결과를 얻을 수 있도록 해보세요.생성형 AI를 이용해 블로그 글이나 SNS 콘텐츠를 쉽게 작성할 수 있어요. 최신 트렌드를 반영한 예시를 통해 효율적으로 콘텐츠를 만들 수 있답니다!데이터 분석도 AI가 도와줄 수 있어요! 복잡한 데이터 해석과 분석을 자동화해 중요한 추세를 빠르게 파악할 수 있답니다.복잡한 작업을 여러 단계로 나누어 AI가 처리하면 효율이 크게 향상돼요. 세분화된 모듈로 더욱 정밀하게 업무를 완성해 보세요!AI와 함께라면 시간 절약, 비용 절감, 효율성 증가의 3박자를 모두 갖출 수 있어요! 더 중요한 일에 집중하며 창의적인 작업에 시간을 할애할 수 있답니다.AI의 자동화와 창의력 지원 기능 덕분에 단순 작업에서 벗어나 중요한 업무에 더 몰입할 수 있어요. 다만, 효과적인 사용을 위해 기본적인 학습 곡선을 이해하는 것도 중요하답니다:D마소캠퍼스와 함께 AI를 활용해 업무 혁신을 이뤄보세요! 효율적이고 스마트한 일의 방식을 통해 성장할 수 있도록 도와드릴게요. 📌관련 강의 <ChatGPT 전략적 활용법 - 리더를 위한 생성형 AI 비즈니스 전략 과정>탁월한 비즈니스 성과를 위한 최상의 선택 불필요한 시간 낭비는 이제 그만! 

AI · ChatGPT 활용ai챗gpt스마트업무혁신비즈니스리더십생성ai프롬프트콘텐츠데이터분석

dmstjd0214

[인프런 워밍업 스터디 클럽 2기_BE] 후기

이번 인프런 워밍업 클럽의 목표는 포기하지 않고 완주하는 게 큰 목적이었다.인프런 워밍업 클럽 2기를 하며 크게 느낀 점이 많았다.클린코드와 테스트 코드에 대한 지식을 얻었다!사실 지식을 얻었다고 했지만 매우 버겁다. 아주 많이 소화하다가 체할 거 같다. 그래도 체득한다면 나는 우빈님처럼 멋진 개발자가 될 거라 생각.....한...다.특히 인상적인 것은 코치님의 말 중 객체에 대한 무례한 행동이 기억에 남았던 것 같다 나는 지금까지 객체를 너무 막대했던 거 같다!! 앞으로 객체와 친해지면서 예의 바른 행동을 해야겠다.자신감을 얻었다!공부를 진행하면서 우빈님이 강의에서 말한 의도나 생각들을 조금이나마 읽을 수 있어서 좋았고 더 나아가 우빈님의 개발 루틴을 볼 수 있어서 좋았다. 새로운 개념에 대해 배워나가며 적용하는 과정이 너무 재밌었고 그 과정에서 자신감이 많이 상승했었던 것 같다.후기판교와 인프런의 공기를 느끼기면서 좋은 기운을 받기 위해 워밍업 클럽 장소 갔었고 도착 후 다양한 개발자분들과 피자를 먹으면서 소통했고, 각각의 생활을 들으며 나도 더 열심히 해야겠다. 라는 생각을 했다. 피자를 다 먹고 난 후강의에서만 보던 우빈님을 실물로 보니 훨씬 더 잘 생겼었다.우빈님의 실시간 Q&A와 질문들을 들으며 공감하는 내용도 많았고 새로 배웠던 점도 많았다. 마지막으로 우수 러너를 발표하는 순간 어떤 분들이 받을지 궁금했는데 내 이름이 적혀있는 것을 보고 어? 내 이름이 동일한 사람이 있냐는 생각과 함께 얼어붙었다. 내가 받아도 되는 상인가를 많이 생각했을 것 했었다.우수 러너 받기 전 걸어가면서 사진 찍는 과정까지 너무 떨려서 기억이 나지 않았다.  상을 받으면서 그래도 꾸준히 한 보람이 있다. 방향성만 맞는지는 모르지만 그런데도 천천히 걸어도 괜찮다는 확신을 갖게 되었다.정리집에 가는 길은 꿈만 같았고 개발자 하길 잘했다고 많이 생각했다.다음 공부는 .. DDD 심화 학습과 간단한 토이 프로젝트를 하며 체득하는 과정을 할 예정이다.인프런 워밍업 스터디 클럽에서 배운 학습 내용을 가지고 개념을 습득하는 과정을 진행해야겠다. 

Rojojun

[워밍업 클럽 스터디 2기::백엔드] 후기

스터디 회고4주간 스터디를 쉼없이 달려왔다.여러가지 일이 있었고, 재미있는 지점도 지루한 지점도 존재하였다.하지만 중요한 건 포기하지 않고 계속 한다 라는 가장 원론적이고 근본적인 자세다! 이미 지나간 말인데 중요한 건 꺾이지 않는 마음이라는 것 같다! 감상적인 이야기는 여기서 끝내고, 회고답게 이 스터디에서 얻어간거 추천하는 것 등등 모든 것을 빠짐 없이 기록하여 3기를 참여하고자 하는 사람들에게 도움을 주고자한다. 스터디 추천도무조건 추천한다! 다만, 끝까지 완주할 의지가 있을 경우에만 추천한다.완주라는게 어떤 사람들은 4주의 진도를 막힘없이 따라가는 것이고, 어떤 사람들은 진도가 중요한게 아니라 4주안에 어떻게든 끝내는 것이 될 수 있다.인프런에서는 4주의 진도를 막힘없이 따라가면 완주러너, 그리고 거기서 더 잘하면 우수러너라는게 있다.즉, 동기부여가 될게 두 가지가 있다는 것이다. 완주러너 & 우수러너하지만 가장 큰 동기부여는 무언가를 뛰어넘어 성장한 자기자신이지 않을까?약간 나는 애니덕후 기질이 있어서 나의 히어로 아카데미아를 좋아하는데 한계를 뛰어넘어라는 이야기를 이야기를 좋아한다.각자 외부에서 주는 동기부여가 아닌 내부에서 주는 동기부여로 한계를 뛰어넘는데 의의가 있는 것이다. 커리큘럼의 난이도또 하나 중요한거 나는 클린코드 & 테스트코드 스터디를 진행하게 되었는데, 시원하게 오픈하면 나는 2년차 백엔드 개발자다 (이번주에 진짜 2년이 되요~~!! 🥳)혹자가 봤을 땐 아닐 수도 있는데, 아직 나는 응애 아가 개발자 중 하나라는 것이다.그런 내가 보았을 때 난이도는 적절한편이다. 중립적인 단어인거 같은데, 어려운 부분은 어려웠다.쉬운부분은 쉬웠고, 그니깐 난도 조절을 정말 잘했다는 것이다... 이것은 강사님의 강의의 퀄리티가 좋다! 라는 것과 일맥상통하는데, 나는 강의에 금액 투자를 신중하게 한다.강사님들에게는 죄송한 이야기지만 어찌되었든간에 나는 소비자니깐! 소비하려는 제품이 얼마나 좋은지 봐야하는데, 확실한 제품아니면 잘 안 구매한다ㅋㅋ...그렇지만! 이번 강의는 진짜 좋다! 더 나은 백엔드 개발자를 고민하였다면 구매를 추천한다! 정리하자면Readable Code 강의는 클린코드를 읽어만 본 사람들, 혹은 적용을 하는데 많이 못하는 사람들에게 추천하는 난이도다.근데, 기본적으로 자바에 대해서 혹은 OOP에 대해서 잘 모른다하면 권장하지 않는다.https://www.inflearn.com/course/practical-testing-%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B0%80%EC%9D%B4%EB%93%9C/dashboardTest Code 강의는 아이러니한 부분이긴 한데, 클린코드를 읽어 보거나 회사 실무내에서 테스트코드가 없이 테스트 하는 것에 대해 한계를 느낀 개발자들에게 추천하는 난이도이다.근데, 기본적으로 다양한 테스트를 경험해보지 않는다면... 테스트코드가 얼마나 좋은지 모를지도 모른다.그냥 내 발목을 붙잡는 쓸모없는 거라고 생각할 수도?https://www.inflearn.com/course/readable-code-%EC%9D%BD%EA%B8%B0%EC%A2%8B%EC%9D%80%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EC%82%AC%EA%B3%A0%EB%B2%95/dashboard 이건 좋아요첫번째, 강사님의 빠른 피드백과 코드 리뷰 너무 좋았다.코드 리뷰도 신청하면 대부분 다 해줘서, 진짜 너무 좋았다.이게 참 강사님 입장에서도 시간적으로 비용일텐데 이렇게 우리 수강생들에게 엄청난 투자를 해줬다는 것에 대해 압도적으로 감사를 가진다!두번째, 전반적인 운영이 매끄러웠다.'인프런에서 진행해서...' 라는 이야기를 안하고, 여타 다른 운영과 비교해 보았을 때 꽤나 괜찮은 운영이라고 느껴졌다.특히나, 디스코드 내에서 직원분들이 이것저것 질문에 대해서 답변을 빠르게 해주거나 아니면 수강생들끼리 채널을 열 수 있게 하는 그런 것들을 하나의 시스템 제도로 만들어서 참 잘 활용하는 것 같다.세번째, 동료들이 자극을 준다.물론 나는 회사동료들하고 같이해서 서로가 서로에게 자극을 주었지만, 이 스터디는 디스코드로 진행되어 자유롭게 이야기를 할 수 있다.여기서 자유롭게 이야기를 할 때 많은 사람들이 스터디 관련해서 이야기 하고 어떤 분은 공부시간 체크, 오늘 한 것 체크 등등 엄청난 분들이 있다 (이름도 외웠다 ㅋㅋㅋㅋ)사실 그 분들을 보면서 엄청 자극이 되서 나도 열심히 공부하게 되는 경우가 있었다. 이건 나빠요좋은 말만 쓰는 것은 싫다 ㅋㅋ 억까라해도 스터디의 단점으로서 장점처럼 세가지를 정할 것이다.첫번째, 야생이다.자신이 진짜 누군가 케어를 해줘야만 공부를 하는 타입이라면, 중도 포기할 가능성이 높다.특히나, 이 스터디는 본인의 의지가 중요한 것이기 때문에, 중간에 '아 밀렸어 안해 포기!' 이렇게 되는 이상 돌이킬 수 없다...두번째, 짧은 네트워킹 타임일단 네트워킹 타임이 50분이라는게 좀 아쉽다... 사람에 따라 다를 수 있는데, 나는 좀 말이 많고 다른 사람들하고 이야기 하는 것을 좋아해서 다른 사람들 그리고 다른 회사에서 어떻게 일하는지 궁금하고 그게 나의 인사이트가 되고 싶은데... 뭔가 엔진이 과열될만 하면 끝나버린다!충분히 이해할 수 있는게 한정된 시간 속에서 진행하는 거고 다 나 같은 사람일거라 생각하지 않기 때문에 이해하는 부분이다.세번째, 낯가리는 우리들...문제는 우리다! 다들 낯을 너무 많이 가린다... 스터디를 함으로서 제2차 파생된 그룹이 나오거나 하는 선순환이 많이 나와야하는데 공개적으로는 두개? 밖에 못본거 같다! 물론, 나도 이건 할 말이 없는데!다음에 스터디를 하게 된다면, 나도 낯을 안가리고 조금 주도하는 역할로 롤을 변경해봐야하지 않나 싶다! 혼자 공부하는게 아니라 같이 공부해야만 내 공부와 내 가설이 맞는지 검증이 되기 때문이다. 진짜 마지막참 우여곡절이 많은 스터디다.뭐 잘하지도 않고, 글재주도 안좋고 마지막만 사진 좀 넣었는데 ㅋㅋㅋ 평소에는 사진도 안넣는다.비효율적인 것을 극도로 자제하는 스타일이라 이런 것을 싫어한다.그런 내게 우수러너라는 상을 준 것에 대해 진짜 너무 감사하고 함께 스터디를 한 내 동료들 진짜 항상 같이 스터디 하는 동료들을 보며 느낀게, 우리가 지금은 이 자리에 있지만 앞으로 더 나아가자는 이야기를 하는데 진짜 진심이다.믿고 의지할 수 있는 동료고 더 높은 자리에서 서로를 볼 수 있을거라고 확신한다. 마지막은 우수러너로 받은 잔, 근데 하이볼을 곁들인 ㅇ_< 

백엔드인프런인프런워밍업클럽스터디2기java자바스프링

하얀종이개발자

인프런 워밍업 스터디 클럽 2기 CS 전공지식 완주 후기

열심히, 그리고 얻은 것처음에는 아무생각없이 인프런 사이트에 들어갔다가 워밍업클럽 배너가 보였습니다.디자인, 프론트엔드, 백엔드, CS 전공지식 등 여러 클럽을 모집하고 있었고, 이전부터 CS 관련된 공부를 해야겠다는 생각과 맞아 떨어져서 감자님이 진행하시는 CS 전공지식 클럽에 참여를 하게 되었습니다. 지식공유자와 함께하는 스터디라고 하며 주어진 강의를 듣고 미션을 수행하는 것이었는데, 참여 필수조건은 강의를 구매해야 하는 것인데요. 할인쿠폰 30%, 40%도 제공되어서 조금 쉽게 결제 버튼을 누를수 있었네요. 항상 스터디를 시작하면 바쁘다는 핑계로 열심히 하려는 초반과는 다르게 후반부로 갈수록 해이해지는 경우가 많았는데요.이번에도 그러지 않을까? 내가 완주할 수 있을까? 걱정이 많이 됐지만, 그래도 하자.!! 라는 생각으로 3주동안 열심히 진행한 것 같아요. 강의 듣기 모든 라이브 세션, 미션 인증, 그리고 발자국을 진행하면서 느낀것을 공유드리고 싶네요.키워드는 열심히, 그리고 얻은 것 입니다.뭔소리냐? 하실 것 같은데, 워밍업 클럽은 내가 주체적으로 열심히만 한다면 너무나 얻을게 많다 라는 것 입니다.코치님의 질문에 대한 실시간 피드백, 미션을 통해 학습한 개념에 대해 스스로 잘 알고 있는지 검증, 다른 러너들의 글을 보며 생기는 동기부여, 정말 열심히 공부할 수 밖에 없는 잘 짜여진 스케쥴이라고 느꼈습니다. 그래서 저는 무사히 완주 할 수 있었고 정말 얻은게 많은 시간이 었습니다. 누가 운영체제나 자료구조에 물어본다면, 조금은 자신있게 대답할 수 있지 않을까 싶네요. 나중에는 저도 지식공유자로 참여해서 코치로 꼭 참여해보고 싶어요. 아 그리고, 저는 인프랩에서 진행하는 오프라인 수료식을 참석도 했었어요. 인프랩에서 너무나 준비를 잘 해주셨는데요.맛있는 식사도 무료로 제공해주시고 네트워킹, Q&A, 수료식, 우수러너 발표까지 정말로 알찬 시간이었습니다.수료식에서는 쑥쓰러워서 코치님 그리고 많은 러너분들과는 이야기 못한게 조금 아쉽지만, 그래도 같이 공부했었다는 생각에 엄청 반갑더라구요. 내적 친밀감 😍인프랩에서 진행하는 워밍업클럽이 얼마나 성장할지 더욱 기대가 되는 것 같아요. 마지막으로 한마디 하고 싶어요. "뭔가를 얻는 것은 노력한 자의 몫이다."다같이 고생한 코치님과 러너님들 감사합니다. 3기하면 또 봬요~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

백엔드인프런워밍업클럽인프런스터디2기

곽민지

토탈 로봇 솔루션 기업 빅웨이브로보틱스 첫 기술 공유회 마로콘에 초대합니다🤖🎉

안녕하세요, 토탈 로봇 솔루션 기업 빅웨이브로보틱스에서 첫 기술 공유회 마로콘을 개최합니다🤖🎉빅웨이브로보틱스는 이기종・다종 로봇 통합 관제 플랫폼 '솔링크'를 개발・운영 중인 곳으로, 이번 기술 공유 행사에서는 솔링크 개발 과정에서 PO와 개발자분들이 하셨던 여러가지 비즈니스, 기술적 고민을 각 주제별 세션으로 나누어 공유할 예정입니다.로봇 플랫폼에 관심있으신 분들은 누구든 대환영입니다🎉🎉 무엇보다도 초기 서비스를 구축하는 과정에서 어떤 기술적 고민을 담아 개발하게 되었는지 궁금하신 분들께 흥미로울만한 이야기가 많이 준비되어 있습니다👀행사 개요는 다음과 같으며, 보다 자세한 세션 정보는 👉행사 안내 및 참가 링크👈를 확인해주세요.행사 일시: 11월 20일 수요일 오후1시~6시행사 장소: 앙트레블 (서울 강남구 강남대로102길 45, 강남역 및 신논현역에서 5분거리)행사 참가비: 무료 (70명 선착순)관심 있는 분들께서는 링크에 접속하셔서 참가 신청서를 작성해주시면 됩니다.참가자분들께는 추첨을 통해 경품도 지급하니 많은 관심 부탁드립니다, 감사합니다 :) 👉행사 안내 및 참가 링크👈 

개발 · 프로그래밍 기타로봇플랫폼AI시스템개발PO백엔드개발프론트엔드개발

[인프런 워밍업 스터디 클럽 2기 백엔드] 4주차 + 회고

 해당 글은 인프런 박우빈 강사님의 「Practical Testing: 실용적인 테스트 가이드」을 바탕으로 작성하였습니다.  강의 요약 Presentation Layer외부 세계의 요청을 가장 먼저 받는 계층사용자 입력 값, 프론트엔드에서 주는 값, 요청 등...주요 로직은 없지만, 최소한의 유효성 검증을 수행한다. 레이어드 아키텍쳐의 단점도메인에 강하게 의존도메인에 레포지토리를 위한 어노테이션을 필연적으로 붙여야 하는 문제 발생⇒ 대안: 헥사고날 아키텍쳐 Mockito로 stubbing 하기가짜 객체를 만들어 행위를 지정하고 테스트하는 방법 (자세한 내용은 미션 6 참조) Test Doubledummy: 아무것도 하지 않는 깡통 객체fake: 단순 형태로, 동일 기능을 수행. 프로덕션에서 쓰기에는 부족한 객체stub: 테스트에서 요청한 것에 대해 기록하여 보여줄 수 있는 객체. 정의하지 않은 요청에는 무응답spy: stub이면서, 호출된 내용을 기록하여 보여줄 수 있는 객체. 일부는 실제 객체처럼 동작.mock: 행위에 대한 기대를 명세하고, 그에 따라 동작하도록 만들어진 객체 stub vs mockstub은 상태를 검증mock은 행위를 검증 더 나은 테스트 작성하기한 문단에는 한 가지 주제만!'테스트 코드 = 문서' 라는 것을 항상 인지해야 한다.완벽한 제어시간, 랜덤 등은 외부에서 주입받도록 리팩토링 하기. 강의 예제의 가게의 영업시간을 테스트했던 것을 기억하자.외부 세계와 소통해야 하는 것은 mocking을 이용한다.독립성 보장하기한 테스트 메서드에는 한 가지 기능만 테스트하기given에서는 가급적 순수 생성자 또는 빌더를 통해 생성하기검증이 있는 팩토리 메서드는 사용 시 예외 발생 가능성이 있다.테스트는 순서 보장이 안 되어 있다.Fixture 구성@BeforeEach, @BeforeAll중복 코드를 줄일 수 있지만 테스트 간의 결합이 생겨버린다.신중한 사용이 필요!Fixture 클렌징deleteAll vs deleteAllInBatchdeleteAllInBatch(): 중간 테이블에 외래키 등으로 인한 오류 발생 때문에 데이터 삭제 순서를 고려해야 함. → 코치님의 추천 메서드deleteAll(): 순서 고려 필요가 없고 연관 테이블을 자동적으로 같이 지워주지만, 삭제 쿼리가 복잡하게 나간다! 전체 테이블을 조회하고 건별로 삭제하는 방식이기에 불필요한 쿼리가 늘어난다.@ParameterizedTest케이스 확장할 때 좋은 방식!재고 타입 테스트할 때를 기억하기!@CsvSource로 제공된 데이터를 @ParameterizedTest가 붙은 메서드의 파라미터에 각각 제공 가능@CsvSource 외에도 @MethodSource, @ValueSource 등이 존재@DynamicTest일련의 시나리오를 테스트@TestFactory가 붙은 메서드에서 Iterable한 반환 값을 던지는 형태 공통의 환경에서부터 일련의 사건을 실행시켜 테스트가 가능.given/when/then 세트가 복수로 생기기 때문에 가독성 저하에 주의하기.환경 통합하기gradle 탭의 tesk에서 test를 수행하면 전체 테스트를 수행해보기전체 테스트 시 Spring Boot가 여러번 로딩하게 되면 비용과 시간 증가...! 서버가 발생하는 횟수를 줄여야 한다!서버를 띄우는 @SpringBootTest과 profile을 지정하는 @ActiveProfile을 별도의 상위 클래스에 붙여 Test 클래스들에 상속시키기!mock도 별도의 환경으로 취급하기 때문에 mock 객체는 상위 클래스에서 protected로 생성하거나 mock이 필요한 환경을 별도로 설정하기.환경 통합을 위해, @DataJpaTest보단 @SpringBootTest를 사용하기private 메서드를 테스트하기결론적으로는, 할 필요도 없고 하려고 해서도 안된다!그래도 고민된다면, 객체를 분리할 시점인지 관해 생하기분리가 필요하다고 판단된다면 객체를 별도로 분리해 private 메서드를 공개 메서드로 작성하면 된다.private 메서드는 외부에서 공개하고 싶지 않은 것이고 외부에서는 몰라도 되는 부분이다! public 메서드를 검증하다보면 자연스레 검증되는 부분이다!+ α헥사고날 아키텍쳐도메인 주도의 아키텍쳐QueryDSLJPA 사용 시 거의 필수타입 체크, 동적 쿼리(값에 null이 들어올 시 자동으로 동적으로 조회해줌)가 가능낙관적 락, 비관적 락CQRS(Command and Query Responsibility Segregation)DB에서 조회와 업데이트를 분리  미션미션 5미션 6미션 5, 6은 직접 테스트 코드를 작성했던 네 번째 미션 보다는 훨씬 편안한 내용이었다. 강의 내에서 이미 정답을 다 알려준 느낌이고, 내 나름의 언어로 정리해보는 느낌이었다.쉽다고 만만히 보았기 때문일까... 특강 때 공통 피드백을 받고 바로 아차 싶었다. @BeforeEach 부분은 단순 중복 제거를 위한 것이 아니라는 점을 간과했다. 리팩토링 강의에서부터 가장 강조하신 것 중 하나가 도메인인데 그것을 놓치다니...🤣🤣 정답은 맞췄어도 풀이 과정 때문에 반타작 밖에 못한 기분이었다.  후기벌써 4주차, 마지막 발자국이자 워밍업 클럽 2기의 마무리이다. 한 달이라는 시간이 쏜살같이 지나가버렸다. 테스트 코드와 리팩토링에 대해 심도 있게 다가간 것은 처음이었던 나에게는 정말 어려웠다. 강의에서 들었던 내용을 과제에 적용하는 과정은 험난했다. 과제를 모두 제출하고 완주를 한 것 만으로도 만족해버리고 말았다. 당장 다음주 시작부터, 새로운 스터디가 시작된다. 같이 워밍업 클럽에 참여하신 분의 자바 스터디인데, 기초부터 다시 다잡는다는 느낌이라 굉장히 기대가 된다. 👏👏마지막으로, 이런 자리를 마련해주신 인프런과 코치님, 그리고 내 부족한 미션 피드백을 해주신 다른 스터디 참여자 분께 감사의 말씀을 드리고 싶다. 언젠가 3기가 열린다면, 다시 한 번 도전하고 싶다!

백엔드워밍업클럽백엔드

w3w

CS_전공지식_마지막미션

운영체제 1.메모리의 종류는 어떤 것들이 있나요? 각 메모리의 특징도 함께 적어주세요. 레지스터-가장 빠른 기억장소로 cpu내에 존재, 휘발성 메모리, cpu를 구분할 때 32비트, 64비트라고 하는데 이것이 레지스터를 의미, cpu는 계산을 할 때 메인 메모리에 있는 값을 레지스터로 가져와서 계산, 계산 결과는 다시 메인 메모리에 저장캐시-레지스터와 메인 메모리 사이에 존재, 메인 메모리에 있는 값을 레지스터로 옮기려면 한참 걸리기 때문에 필요할 것 같은 데이터를 미리 가져오는데, 미리 가져온 데이터를 저장하는 곳메인메모리-실제 운영체제와 다른 프로세스들이 올라가는 공간, 전환이 공급되지 않으면 데이터가 지워지기 때문에 휘발성 메모리보조 저장장치( ssd, 하드디스크)-가격이 저렴하고 전원이 공급되지 않아도 데이터가 지어지지 않는 비휘발성 메모리 2.사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요? 경계 레지스터입니다. 3.메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요? -가변 분할 방식장점: 메모리의 연속된 공간에 할당되기 때문에 더 크게 할당돼서 낭비되는 공간인 내부단편화가 없다.단점: 외부단편화가 발생한다. -고정 분할 방식장점: 구현이 간단하고 오버헤드가 적다.단점: 내부단편화가 발생한다. 4.CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요? 스레싱입니다. 5.HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.hdd는 속도가 느리고 hdd를 넣을 큰 공간이 필요하다는 단점이 있지만, 계속해서 저장되어 있어야 하는 데이터들이 있기 때문에 컴퓨터를 실행시키는데 꼭 필요하다고 생각합니다. ssd는 데이터를 덮어 쓸 수가 없고, 똑같은 자리에 데이터를 써야 한다면 데이터를 지워야 하는 횟수가 정해져 있다는 단점이 있지만, hdd처럼 큰 공간이 필요하지 않고, 자석을 갖다대도 훼손되지 않으며, 속도가 빠르다는 장점이 있어 컴퓨터를 실행시키는데 꼭 필요하다고 생각합니다. 다 각자의 장단점이 있기에 둘다 사용해서 장단점을 보완하면 더 좋은 성능의 컴퓨터를 만들 수 있다고 생각합니다. 6.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요? 파일시스템은 효율적으로 관리하기 위해 빈 공간을 모아둔 free block list를 가지고 있습니다. 특정 파일을 삭제한다면 파일 시스템은 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더를 지우고 free block list에 추가합니다. 이렇게 처리하면 사용자는 파일이 삭제된 것처럼 느껴지는데, 사용했던 데이터는 남아있기 때문에 포렌식으로 파일을 복구할 수 있습니다. 자료구조와 알고리즘 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.- 버블정렬장점: 이해와 구현이 간단단점: 성능이 좋지 않음시간 복잡도: O(n^2)-선택정렬장점: 버블정렬과 마찬가지로 이해와 구현이 간단단점: 버블정렬과 마찬가지로 성능이 좋지 않음시간 복잡도: O(n^2)-삽입정렬장점: 버블정렬, 선택정렬과 마찬가지로 이해와 구현이 간단단점: 버블, 선택정렬과 마찬가지로 성능이 좋지 않음시간 복잡도: O(n^2)-병합정렬장점: 성능이 좋음단점: 이해와 구현이 어려움시간 복잡도: O(nlogn)-퀵정렬장점: 병합정렬과 동일단점: 병합정렬과 동일시간 복잡도: 평균적으로 세타(nlogn), 최악의 경우 O(n^2)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요. 메모이제이션은 재귀를 통해 문제를 하향식으로 해결합니다. 재귀만 이용한다면 성능에 문제가 발생하는데 이를 계산 결과를 저장하는 것으로 보완했습니다. 메모이제이션은 많은 메모리를 사용하여 성능을 향상시킵니다. 따라서 재귀가 직관적일 때는 메모이제이션을 사용합니다. 재귀가 직관적이지 않을 땐 상향식 조건인 타뷸레이션을 이용해 메모리도 절약하고 속도도 빠르게 해결할 수 있습니다. 메모리가 부족한 시스템이지만 재귀로 쉽게 구현이 가능할 것 같으므로 메모이제이션을 사용하는 것이 좋을 것 같다고 생각합니다.

알고리즘 · 자료구조

w3w 24일 전
장태근

[인프런 워밍업 스터디 클럽] 2기 - 마지막 발자국

누군가에는 길기도, 짧기도 했던 워밍업 클럽 일정이 종료됐다.*물론 완주까지 '수료식'이라는 태산 같은 축제가 기다리고 있다. 이전 3주 차까지는 테스트를 작성하는 자세와 기본 개념에 대해 배웠다면, 이번 주는 '테스트를 그래서 어떻게 사용하면 좋을까?' 고민하고 의견 나누는 시간을 가졌다. 강의섹션 6. Spring & JPA 기반 테스트: 어떤 생각, 의도를 가지고 테스트를 작성하면 좋을까?섹션 7. Mock을 마주하는 자세: 그래서 Mock 좋아하세요...?섹션 8. 더 나은 테스트를 작성하기 위한 구체적 조언: 음성을 듣고 지식공유자의 의도를 추론하라.섹션 9. Appendix: 묻고 따지지 않고 바로 적용하여 생산성 올리기섹션 10. Outro: 잊지마세요. 당신의 초심과 철학 실습이 많았던 강의였던 만큼 호흡이 길었다. 그런데 마침 컨디션 관리도 실패했다. 감기에 걸려 곤혹을 치뤘다.'완주러너 못할 수도 있겠다'라는 불안, 당혹감도 찾아왔다. 컨디션이 좋아졌을 때 '계왕권'을 사용했다. 결국 모든 조건을 만족했다. 미션Layered Architecture는 왜 그럴까?Mock을 마주합니다. 그런데 Test Fixture를 곁들인색다른 방법으로 해결했다. 이전에는 '강의를 듣고 나서 생각을 정리한다'라는 관점을 가졌다. 하지만 이번 주는 '우선 해결한다'라는 방법을 적용했다. 출제자의 의도를 먼저 분석했다. 다시 한번 '오늘부터 내 꿈은 너야' 대사를 외치며 마법을 사용했다. 오랜 시간을 사용하지 않고 간단한 프로토 타입을 만든다는 생각으로 임했다. 결국 빠르게 문제를 해결할 수 있었다. 그런데 문제 해결보다 더욱 좋았던 점은 사고 확장이다. 우빈 님께서 생각하시는 의견과 내가 알아내 지식과 무엇이 다른지 생각하고, 정리할 수 있었다. 조금 더 능동적으로 사고했다고 생각한다.(물론 이번 주 미션이 코드에 의도를 담는 작성 미션이 아닌 정리 미션인 덕분에 빠르게 해결한 것 같다는 생각도 있다) 정리하면 '예습 후 복습'이라는 학창 시절을 회상하는 원론적인 방법을 적용했다. 적용하고 나니 상황에 따라 적절한 방법이라고 생각한다. 이전에는 '미션에 너무 많은 자원을 사용하고 있지 않나?' 의문도 들었는데 이번에는 빠르게 해결하고 퀄리티를 보충해서 '완벽의 함정'에서 탈출할 수 있었다. 개발은 아니지만 '애자일'과 관련 있다고 생각한다. 자신감을 얻어 종종 사용할 것 같다. 마치며이번 주 가졌던 생각을 허심탄회하게 풀어내니 시원섭섭하다. 워밍업 클럽과 함께 벌써 보냈을 뿐인데 올해도 60일정도 남았다. 마지막 남은 진짜 진짜 최종 일정 '수료식'까지 잘 마치면 좋겠다. 1기와 2기를 보낸 러너의 후기는 '장태근블로그'에거 계속된다. <참고 자료>인프런 워밍업 클럽 스터디 - BE 클린 코드 & 테스트 과정

백엔드인프런워밍업클럽

인프런 워밍업 클럽 스터디 2기 - CS 전공지식<10월 셋째주 발자국>

알고리즘각 정렬에 대해 학습하니다. 삽입 정렬까지는 혼자 힘으로 개념을 구현할만하다고 느꼈지만 퀵 정렬과 병합 정렬의 경우 구현을 하기 위해 많은 시간이 소요되었습니다. 지금 해당 알고리즘을 혼자 구현해보고 강의를 수강한 시간이 1주 정도 지났지만, 해당 알고리즘을 혼자 구현한 기억으로 금방 대략적인 흐름과 동작방식을 떠올릴 수 있었습니다. 이런 점에서 그냥 무작정 따라 치는 것을 넘어서 함께 고민하고 능동적으로 강의를 따라오는 것이 매우 중요하다는 것을 느꼈습니다.   운영체제 지금까지의 강의 과정 중에 이번 강의가 가장 어려웠습니다. 특히 가상 메모리의 구현 과정으로 세그멘테이션, 페이징, 페이지드 세그멘테이션, 메모리를 가져오는 방법, 메모리를 내보내는 페이지 교체 정책을 한번에 정리해서 메모리의 동작 과정을 정리하는 것에 많은 시간이 소요되었습니다. 강의에 나온 에니메이션을 따라 그려보고 블로그, 유튜브 등을 참고하며 추가로 학습을 하며 얼추 감이 잡힌 것 같습니다. 운영체제 강의 중에 제일 고비가 아니었을까 합니다.  마지막 과제를 늦게 제출하게 되었지만 강의를 완강하고 운영체제와 기초 자료구조를 학습할 수 있는 매우 뜻깊은 기회였습니다. 특히 두 번째 온라인 세션에서 감자님이 알려주신 기초 지식의 힘을 느낄 수 있어서 중간에 지치지 않고 끝까지 완주할 수 있었습니다.

채널톡 아이콘