블로그

minme9055

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

운영체제세그멘테이션(배치정책)메모리를 논리적 단위(세그먼트)로 분할각 세그먼트는 다양한 크기 가능외부 단편화 문제 발생 가능페이징(배치정책)메모리를 동일한 크기의 페이지로 분할물리 메모리와 가상 메모리 간 매핑내부 단편화 발생 가능, 외부 단편화 해결페이지드 세그멘테이션(배치정책)세그멘테이션과 페이징 결합세그먼트를 페이지 단위로 나눔유연성과 효율성 향상디맨드 페이징(가져오기 정책)필요한 페이지만 메모리에 로드페이지 부재 시 디스크에서 가져옴메모리 사용 효율성 증가페이지 교체정책FIFO, LRU, LFU 등 다양한 알고리즘새 페이지 로드 시 어떤 페이지를 교체할지 결정페이지 부재율 최소화 목표스레싱과 워킹셋스레싱: 과도한 페이지 교체로 성능 저하워킹셋: 프로세스가 자주 참조하는 페이지 집합워킹셋 관리로 스레싱 방지주변장치(I/O 디바이스, 저장장치)CPU, 메모리 외 하드웨어 장치입력, 출력, 저장 기능 수행인터럽트 기반 동작마우스/키보드사용자 입력 장치이벤트 기반 동작인터럽트 처리 필요하드디스크/Flash Memory(SSD)하드디스크: 기계식, 대용량, 저렴SSD: 전자식, 고속, 고가비휘발성 저장 장치파일과 파일시스템파일: 관련 데이터의 논리적 집합파일시스템: 파일 저장, 조직, 검색 관리메타데이터 관리 포함디렉토리파일들의 논리적 컨테이너계층적 구조 (트리 구조)파일 검색, 그룹화 용이파일과 디스크파일 할당 방식: 연속, 연결, 인덱스 할당빈 공간 관리디스크 스케줄링 알고리즘 자료구조와 알고리즘정렬 - 삽입정렬원리: 정렬된 부분에 새 원소를 적절한 위치에 삽입시간 복잡도: 평균 및 최악 O(n^2), 최선 O(n)특징: 작은 데이터셋에 효율적, 부분 정렬된 배열에 유리안정적 정렬 알고리즘정렬 - 병합정렬원리: 분할 정복 방식, 작은 부분으로 나누고 병합하며 정렬시간 복잡도: 항상 O(n log n)특징: 대규모 데이터 정렬에 효율적, 추가 메모리 필요안정적 정렬 알고리즘정렬 - 퀵정렬원리: 피벗 선택 후 분할 정복 방식으로 정렬시간 복잡도: 평균 O(n log n), 최악 O(n^2)특징: 실제 구현에서 매우 빠름, 불안정 정렬피벗 선택 방법이 성능에 큰 영향동적 프로그래밍 - 메모이제이션원리: 계산 결과를 저장하고 재사용 (캐싱)특징: 주로 하향식(top-down) 접근법장점: 중복 계산 방지로 효율성 향상적용: 피보나치 수열, 최장 공통 부분 수열 등동적 프로그래밍 - 타뷸레이션원리: 작은 부분 문제부터 해결하며 표를 채움특징: 상향식(bottom-up) 접근법장점: 일반적으로 메모리 사용량이 적음적용: 냅색 문제, 최단 경로 문제 등3주차 후기지난 주차보다는 익숙한 단어들이 많이 보였다. 그래서 조금 가벼운 마음으로 시작했다가 어김없이 혼돈으로 접어드는 루트의 반복이었던 주였다. 언제쯤 이 단어와 개념과 친구 먹을 수 있을까 😂운영체제에서는 가상 메모리에 대해 배우면서 세그멘테이션과 페이징의 개념을 잡고, 메모리 관리 기법의 발전 과정을 따라 공부해 보았다. 입출력 장치와 파일 시스템에 대해 공부하면서는 하드웨어와 소프트웨어의 상호작용을 중점으로 공부했는데, SSD와 하드디스크에 대한 내용을 공부할 때는 노트북 살 때의 경험을 떠올리면서 들으니 다른 파트보다 조금 더 재밌게 들을 수 있었던 것 같다.알고리즘에서는 다양한 정렬 방법들과 동적 프로그래밍에 대해 배웠다. 정렬에 대해 공부할 때는 각각의 장단점을 비교하면서 언제 적합하게 사용할 수 있을지를 주요 포인트로 공부했다. 이미 이전에도 몇 번 봤던 개념이라 막 어렵다는 느낌은 없었다. 그런데 동적 프로그래밍이 개인적으로 좀 어려웠던 것 같다. 동적인건 언제나 어렵다, 다 정적이었으면 좋겠다 라고 궁시렁 거리면서 공부했다. 그래도 감자쌤과 함께 찬찬히 공부하니 완벽하게는 아니어도 어렴풋이 개념은 잡을 수 있었던 것 같다. 인프런 워밍업 클럽 2기 후기한 번도 공부해보지 않은 CS를 공부해보겠다고 시작한 워밍업 클럽은 생각보다 빠르게 지나갔다. 회사 일이랑 이직 준비랑 다른 스터디에 엄청 치이면서도 워밍업 클럽을 포기하지 않은 건, 하루에 수행할 수 있는 적합한 학습량과 감자쌤의 친절나긋한 설명 덕분이 아닐까 싶다. 그리고 워밍업 클럽을 같이 진행하면서 열심히 하시는 다른 분들의 모습에도 많은 자극을 받았던 것 같다. 3주 동안 감자쌤과 함께 배운 내용들을 완벽하게 이해했다고 할 수는 없지만, 전반적인 내용을 파악했고 어느 부분이 어려운지도 알았으니 앞으로 공부하면서 부족한 부분들을 더 채워나가야겠다.

알고리즘 · 자료구조인프런인프런워밍업클립CS운영체제자료구조알고리즘감자3주차

minme9055

[인프런 워밍업 클럽 2기 CS] 3주차 미션

운영체제1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.RAM: 빠른 읽기/쓰기가 가능하지만, 전원이 꺼지면 내용이 사라집니다.ROM: 읽기 전용이며, 내용이 영구적으로 보존됩니다.캐시: CPU와 가까이 있어 매우 빠르지만, 비용이 높습니다.가상 메모리: 하드디스크 일부를 RAM처럼 사용합니다. 속도는 느리지만 큰 용량을 사용할 수 있습니다.2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터(Boundary Register)입니다. 이것이 없으면 프로그램들이 운영체제 영역을 무단으로 접근할 수 있어 문제가 생길 수 있습니다.3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?고정 분할: 설정과 관리가 쉽습니다. 하지만 메모리 낭비가 심할 수 있습니다.가변 분할: 메모리를 효율적으로 사용할 수 있습니다. 다만 관리가 조금 복잡할 수 있습니다.4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스래싱(Thrashing)이라고 합니다. 시스템이 너무 바빠서 정작 실제 작업은 못 하는 상황을 말합니다.5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.네, 필요합니다. 전원이 꺼져도 데이터를 유지해야 하기 때문입니다. 하지만 RAM만으로 운영되는 특수한 시스템도 있긴 합니다. 이를 "RAM 디스크" 또는 "메모리 전용 시스템"이라고 부릅니다. 주로 아주 빠른 처리 속도가 필요하거나, 데이터의 영구 저장이 필요 없는 특수한 경우에 사용됩니다.6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제해도 실제 데이터는 지워지지 않고, 그 공간을 재사용 가능하다고 표시만 합니다. 그래서 덮어쓰기 전이라면 복구가 가능합니다.자료구조와 알고리즘1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬: 구현이 쉽지만, 속도가 느립니다 (O(n^2))선택 정렬: 구현이 쉽지만, 역시 속도가 느립니다 (O(n^2))삽입 정렬: 작은 데이터에 효과적이며, 평균/최악의 경우 O(n^2)입니다병합 정렬: 안정적이고 항상 O(n log n)의 성능을 보이지만, 추가 메모리가 필요합니다퀵 정렬: 평균적으로 빠르며 O(n log n), 최악의 경우 O(n^2)의 성능을 보입니다2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션을 사용하는 것이 좋습니다. 메모이제이션은 재귀 호출을 많이 하기 때문에 스택 오버플로우가 발생할 수 있어요. 반면 타뷸레이션은 반복문으로 해결하기 때문에 메모리를 덜 사용합니다.

알고리즘 · 자료구조인프런인프런워밍업클럽CS운영체제자료구조알고리즘감자3주차

강지원

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

따라하며 배우는 리액트 A-Z (7~13강) Day 11 (리액트 테스트 경험하기) TDD (Test Driven Development)개발 전 테스트 코드를 먼저 작성하는 방법론 순서테스트 코드를 작성 → 실행 (당연히 실패) → 딱 이 테스트 코드를 통과할 만큼의 코드만 작성 → 성공 → 다른 테스트 코드 작성으로 이동전부를 다 한 다음에 리팩토링 작업을 실행여기서 문제가 된다면 다시 테스트 코드를 확인하고 수정함 TDD의 장점소스 코드에 안정감을 줌디버깅 시간과 개발 시간이 줄어듦시스템 전반적인 설계 향상 (클린 코드가 나올 확률이 높아짐)개발 집중력 향상 (테스트를 하나씩 깨나가면서 개발할 수 있기 때문)  Day 12 (NextJS, 타입스크립트)내용을 복습하면서 원래 알고 있던 것 + 새로 알게 된 내용을 공부하는 방식으로 공부했다.특히 TS의 타입 들을 코드로 정리하면서 어떤 타입이 있었는지 다시 새길 수 있었다. Next.jsReact의 SSR을 쉽게 구현할 수 있게 도와주는 간단한 프레임 워크 특징 Full-StackFile-based RoutingSEO, Image, Font OptimizationServer Side RenderingHybrid Rendering CSR (Client Side Rendering)리액트만으로 프로젝트를 만들면 발생 → 렌더링 하는 주체가 클라이언트 (브라우저) 장점한번 로딩 되면, 빠른 UX 제공서버의 부하가 작음 단점페이지 로딩 시간(TTV)이 김 (FCP가 오래 걸린다고도 함)자바스크립트 활성화가 필수임SEO가 힘듦보안에 취약 (모든 react 라이브러리, js 소스 코드를 다 다운 받아야 하기 때문에)CDN(Content Delivery Network)에 캐시가 안됨 → 이러한 많은 단점들을 해결하기 위해서 나온 것이 SSR SSR (Server Side Rendering렌더링 하는 주체가 서버렌더링 되는 순간 : 요청 시 렌더링 (미리 해두지 않음) 장점페이지 로딩 시간(TTV)이 빠름자바스크립트 활성화 여부가 필요 없음SEO 최적화가 좋음보안이 뛰어남CDN에 캐시가 됨실시간 데이터를 사용!사용자 별 필요한 데이터를 사용함 (요청 시 렌더링 하기 때문에 요청하는 사람에 맞게 데이터 제공이 가능) 단점비교적 느릴 수 있음서버에 과부하가 걸릴 수 있음 (몇 천명의 페이지를 요청 시 마다 계속 만들어야 하기 때문에)CDN에 캐시가 안됨 (요청마다 새로운 페이지를 만들기 때문에) Typescript 타입 : value가 가지고 있는 프로퍼티나 함수를 추론할 수 있는 방법JS의 dynamically type이 야기할 수 있는 runtime error를 해결하기 위해 statically type을 적용 시킨 언어 사용하는 이유Typescript는 JS코드를 단순화하여 더 쉽게 읽고 디버그할 수 있도록 함Typescript는 코드 유형 검사를 통해 JS를 작성할 때 고통스러운 버그를 피할 수 있도록 도와줌  Day 13 (리덕스 학습하기 및 리액트 19) ReduxJS 어플리케이션을 위한 상태 관리 라이브러리 data flowAction간단한 JavaScript 객체수행하는 작업의 유형을 지정하는 'type' 속성이 있으며 선택적으로 redux 저장소에 일부 데이터를 보내는 데 사용되는 'payload' 속성을 가질 수도 있음 Reducer어플리케이션 상태의 변경 사항을 결정하고 업데이트 된 상태를 반환하는 함수store 내부의 상태를 업데이트함 Redux Store어플리케이션의 전체 상태 가지고 있는 객체내부 상태를 변경하는 유일한 방법은 해당 상태에 대한 Action을 전달하는 것 Redux 미들웨어action을 dispatch하고 reducer에 도달하는 순간 사이에서 사전에 지정된 작업을 실행할 수 있게 해주는 중간자 Redux Thunk비동기 작업을 할 때 많이 사용하는 방법Redux Thunk도 리덕스 미들웨어액션 내부에서 다양한 작업을 할 수 있게 해줌 Redux ToolkitRedux 로직을 작성하기 위한 공식 권장 접근 방식Redux 코어를 둘러싸고 있고, Redux 앱을 빌드하는 데 필수적인 패키지와 기능이 포함되어 있음Redux 작업을 단순화하고 일반적인 실수를 방지하며, Redux 앱을 더 쉽게 작성할 수 있도록 도와줌 느낀 점 redux의 기본 사용 법을 처음으로 배우는 것이라 신기하고 어렵게 느껴졌다. 강의를 따라가면서 기초에 집중하려고 노력했는데, 처음 배운 개념을 이용해서 앱을 만드려니 꽤나 막막해서 시간이 많이 걸렸다. 앞으로 더 능숙해지고 싶다. 일주일 회고스터디 중간에 몸이 3일 동안 아팠어서 시간이 많이 없었지만 열심히 달려서 겨우 완주 조건까지 달성했다.매일 새벽까지 과제를 개발한 덕에 JS 과제 5개와 React 과제 3개를 해냈다. 모든 과제를 해내면 신입 역량 이상이라고 하셨었는데 나는 아직 신입 역량 정도였나 보다. 아쉽다.그동안 머릿속에 스터디만 가득한 채로 3주를 보냈는데 막상 끝나려고 하니까 아쉽지만 3주전의 나와 지금의 나를 비교했을 때 많은 성장을 이뤄낸 것 같아서 뿌듯하다.이번에 알게 된 부족한 점들을 바탕으로 앞으로의 공부 계획을 세워나갈 예정이다.정말 의미 있는 시간이었고, 꼭 필요했던 시간이라고 생각한다. 강의 출처강의 주소(React) : https://www.inflearn.com/course/따라하는-리액트/코치님 성함 : John Ahn

ReactNextJSTypescriptRedux프론트엔드인프런스터디3주차

lar

[인프런 워밍업 클럽 스터디 1기] 세번째 발자국

1. 3주차 학습한 내용 [10일차 - 객체지향과 JPA 연관관계]1. JPA 연관관계에 대한 추가적인 기능들1:1 관계 - @OneToOne예) 한 사람은 한 개의 실거주 주소만을 갖고 있다.@OneToOne 어노테이션을 사용한다.연관관계 주인이 아닌 쪽에 mappedBy 옵션을 사용한다.연관관계의 주인 효과객체가 연결 기준이 된다.상대 테이블을 참조하고 있으면 연관관계의 주인이다.연관관계 주인이 아니면 mappedBy를 사용한다.연관관계의 주인의 setter가 사용되어야만 테이블을 연결한다.연관관계의 사용 시 주의해야 할 점트랜잭션이 끝나지 않았을 때, 한 쪽만 연결해두면 반대 쪽은 알 수 없다. > setter 한번에 둘이 같이 이어주면 된다.N:1 관계 - @ManyToOne과 @OneToMany@ManyToOne을 단방향으로만 사용할 수도 있다.cascade 옵션 : 한 객체가 저장되거나 삭제될 때, 연결되어 있는 객체도 함께 저장되거나 삭제되는 옵션이다.orphanRemoval 옵션 : 객체간의 관계가 끊어진 데이터를 자동으로 삭제하는 옵션이다.실제 DB에서 데이터를 삭제하고 싶을 때 사용한다.@JoinColumn연관관계의 주인이 활용할 수 있는 어노테이션을 의미한다.필드의 이름, null여부, 유일성 여부, 업데이트 여부 등을 지정한다.N:M 관계 - @ManyToMany구조가 복잡하고, 테이블이 직관적으로 매핑되지 않아 사용하지 않는 것을 권장한다.도메인 계층에 비즈니스 로직이 들어갔다?BookService는 UserLoanHistory 객체를 직접 사용하지 않도록 변경하였다.User와 UserLoanHistory, 2개의 객체가 서로 협력하도록 변경하였다. 이를 도메인 계층에 비즈니스 로직이 들어갔다라고 표현한다.2. 영속성 컨텍스트의 4번째 특징지연 로딩(Lazy Loading) : 연결되어 있는 객체를 꼭 필요한 순간에만 가져온다.@OneToMAny의 fetch 옵션이다.(기본적으로 Lazy로 설정되어 있다.)연관관계를 사용하면 무엇이 좋을까?각자의 역할에 집중하게 된다. (=응집성)새로운 개발자가 코드를 읽을 때 이해하기 쉬워진다.테스트 코드 작성이 쉬워진다.연관관계를 사용하는 것이 항상 좋을까?지나치게 사용하면 성능 상의 문제가 생길 수도 있고, 도메인 간의 복잡한 연결로 인해 시스템을 파악하기 어려워질 수 있다.비즈니스 요구사항, 기술적인 요구사항, 도메인 아키텍쳐 등 여러 부분을 고민해서 연관관계 사용을 선택해야 한다.[11일차 - 기본적인 배포를 위한 준비]1. 배포란?최종 사용자에게 SW를 전달하는 과정을 의미한다.전용 컴퓨터(AWS)에 우리의 서버를 옮겨 실행시키는 것이다.최종 사용자가 우리의 서버를 쓸 수 있는 방법전용 컴퓨터에 코드를 옮기고 스프링, MYSQL 등을 설치해 사용자가 접속하게 한다.AWS에서 컴퓨터를 빌릴 때 알아둬야 할 점컴퓨터를 살 때 운영체제도 같이 선택한다.윈도우, 리눅스, 맥OS2. profile과 H2 DBprofile 적용스프링 서버를 실행할 때 db와 같은 설정들을 코드 변경 없이 제어할 수 있는 방법spring: config: activate: on-profile: local datasource: url: "jdbc:h2:mem:library;MODE=MYSQL;NON_KEYWORDS=USER" username: "sa" password: "" driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.H2Dialect h2: console: enabled: true path: /h2-console --- spring: config: activate: on-profile: dev datasource: url: "jdbc:mysql://localhost/library" username: "root" password: "" driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.MySQL8Dialect 3. git과 githubgit이란?코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램을 의미한다.버전 A, 버전 B를 쉽게 만들 수 있게 해주고 여러 버전을 쉽게 취합이 가능하다.github이란?git으로 관리되는 프로젝트의 코드가 저장되는 원격 저장소를 의미한다.왜 github에 코드를 저장하는걸까?컴퓨터의 있는 소스코드가 소실될 수 있기 때문에 코드를 원격의 저장하는 것이다.배포할 때도 활용한다.4. git 기초 사용법git을 활용해서 github 프로젝트 업로드하기github 사이트 접속github 저장소 생성한다.(Create Repository)IntelliJ Terminal을 이용해 git 명령어 입력git 프로젝트 시작하기 / git init : 이 프로젝트를 이제 git이 관리하겠다는 의미git 프로젝트의 github 저장소 설정하기 / git remote add origin [각자의 주소]기초 셋팅 완료git 기초 명령어코드를 git에 추가할 때 명령어git add.git에 메세지 붙이는 명령어git commit-m "메세지"git을 github에 보내기git push현재 상황 확인하기git status파일들 빼주기git reset5. AWS의 EC2 사용하기회원가입AWS 계정 생성(회원가입) - 회원정보/결제정보/본인인증/Support 플랜 (무료) 선택로그인루트 사용자 선택 - 계정입력 후 로그인콘솔 홈지역(서버) 서울로 설정서비스에서 EC2 검색 및 클릭 - 리소스 : 인스턴스(빌린 컴퓨터) 클릭인스턴스 시작 클릭 - 이름 및 태그 : 이름 입력 - 아마존 리눅스 선택 - 인스턴스 유형(빌린 컴퓨터의 사양) CPU 및 메모리 t2.micro 선택 - 키 페어 : 새 키 페어 생성 - 키 페어 이름 입력 수 생성 - 네트워크 설정 : 보안 그룹 생성 선택 - 스토리지 구성(용량) 8gib - 설정 후 인스턴스 시작 클릭인스턴스 목록을 보면 실행 중인 서버가 확인된다. [12일차 - AWS와 EC2 배포]1. EC2에 접속해 리눅스 명령어 다뤄보기다운로드 받은 키 페어를 이용하는 방법우리가 접속하려는 EC2의 IP 주소 : 퍼블릭 IPv4 주소이전 시간에 다운로드 받았던 키 페어접속하기 위한 프로그램(git CLI 또는 Mac treminal)기본적인 리눅스 명령어mkdir : 폴더를 만드는 명령어ls : 현재 위치에서 폴더 또는 파일을 확인하는 명령어cd : 폴더 안으로 들어가는 명령어pwd : 현재 위치를 확인하는 명령어2. 과제여섯 번째 과제(6일차)일곱 번째 과제(7일차)3. 회고프로젝트 배포 하는 법을 알 수 있어서 좋았고, 배포를 하면서 오류가 발생해서 한번에 되지 않아 시간이 오래 걸렸다. 리눅스에 대한 공부도 해야겠다는 생각이 들었다. 아직 미니 프로젝트를 진행하진 못했지만 배운 것을 활용해서 잘 마무리해야겠다!

백엔드워밍업발자국회고3주차

lar 6개월 전
miiro

[인프런 워밍업 스터디 클럽 1기] BE 3주차 회고록

세 번째 발자국자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]를 수강하고인프런 워밍업 클럽에 참여하여 쓰는 세 번째 회고록입니다. 학습 내용배포란?최종 사용자에게 SW를 전달하는 과정이다. = 전용 컴퓨터에 우리의 서버를 옮겨 실행시키는 것서버용 컴퓨터는 보통 리눅스를 사용한다.profile과 H2 DBprofile : 똑같은 서버 코드를 실행시키지만, 실행될 때 설정을 다르게 하고 싶다.(ex. Database)[예시]local profile -> H2 DBdev profile -> MySQL DB  H2 DB경량 database로, 개발 단계에서 많이 사용하며 디스크가 아닌 메모리에 데이터를 저장할 수 있다.메모리에 데이터를 저장하면 휘발되는 특징으로 인해 개발 단계에서만 사용한다개발단계에서는 테이블이 계속 변경되는데, 데이터가 휘발되기에 ddl-auto 옵션을 create로 주면 테이블이 자동 생성/삭제가 되기에 주로 사용된다.git/githubgit코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램githubgit으로 관리되는 프로젝트의 코드가 저장되는 저장소사용하는 이유?코드는 어떠한 이유로든 소실이 될 가능성이 있다.배포를 할 때 활용할 수 있다.git 명령어git init해당 프로젝트를 git이 관리하겠다는 의미git 프로젝트의 github 저장소 설정git remote add origin [git 주소]코드를 git에 모든 파일을 넣는다git add .Git 커밋 명령어git commit -m '메시지'Git 푸시 명령어git push코드 github에 최초로 보내기git push --set-upstream origin masterGit 상태 확인git status.gitignore파일 안에 적힌 폴더 및 파일의 이름은 깃으로 관리하지 않는다. EC2에 접속해서 리눅스 명령어 다뤄보기 EC2 접속 방법다운로드 받은 키 페어(pem key)를 이용하는 방법접속하려는 EC2의 IP 주소다운로드 받은 키 페어 접속하기 위한 프로그램(git CLI or Mac Terminal) chmod 400 키페어이름.pemssh -i 경로/키페어이름.pem ec2-user@IPAWS 콘솔을 활용해서 접속하는 방법 기본적인 리눅스 명령어mkdir : 폴더를 만드는 명령어ex) mkdir folder1ls : 현재 위치에서 폴더나 파일을 확인하는 명령어ls -l : 조금 더 자세한 정보를 확인할 수 있다. drwxrwxr-x : folder1은 폴더이다.drwxrwxr-xr : 읽는 권한, w : 쓸 수 있는 권한, x : 실행 권한rwx/rwx/r-x폴더 소유자 권한 / 폴더 소유 그룹 권한/ 모든 접근의 권한2 : 폴더에 걸려 있는 바로가기 개수ec2-user : 폴더 소유주의 이름ec2-user : 폴더 소유 그룹의 이름6 : 폴더(파일의 크기) 단위 : byte cd(change directory) : 폴더 안으로 들어가는 명령어ex) cd folder2pwd(print working directory) : 현재 위치 확인하는 명령어/home/ec2-user/folder1cd .. : 상위 폴더로 올라가는 명령어rmdir : 특정 폴더(디렉토리) 제거하는 명령어 배포를 위한 프로그램 설치하기 코드를 가져오기 위한 Gitsudo yum install git : yum을 이용한 프로그램 다운로드 진행한다.서버를 구동할 Javasudo yum install java-11-amazon-corretto -yjava -version : 자바 버전 확인데이터베이스 MySQLsudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpmsudo dnf install mysql-community-serversudo systemctl status mysqldsudo systemctl restart mysqldsudo cat /var/log/mysqld.log | grep "A temporary password"mysql8의 임시 비밀번호를 확인하는 명령어alter user 'root'@'localhost' identified with mysql_native_password by 'Abdc1234!';비밀번호는 대/소문자, 특수문자 포함 8자 이상 리눅스에서 스프링 배포 프로그램 설치sudo yum updatesudo : 관리자 권한 실행yum : 리눅스 패키지 관리 프로그램(ex. gradle과 비슷한 역할)update : 현재 프로그램들을 최신화 설정한다. 빌드와 실행, 그리고 접속 git 코드 로딩 :git clone [github 저장소 주소]swap 설정기존에는 RAM을 사용해야하지만 RAM의 용량이 부족한 경우, 일부 Disk를 사용하게 해준다.#swap 메모리를 할당한다. (128M 16 = 2GB) sudo dd if=/dev/zero of=/swapfile bs=128M count=16 #스왑 파일에 대한 권한 업데이트 sudo chmod 600 /swapfile #swap 영역 설정 sudo mkswap /swapfile #swap 파일을 사용할 수 있도록 만든다. sudo swapon /swapfile #swap 성공 확인 sudo swapon -schmod +x ./gradlewgradlew를 사용하기 위해 실행할 수 있도록 설정한다../gradlew build -x testgradle을 이용해 프로젝트를 빌드한다. -> 테스트코드는 실행하지 않는다. java -jar build/libs/library-app-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev--spring.profiles.active=dev : 설정 파일등록 이후에 인스턴스 인바운드 규칙 설정을 해줘야한다.8080 포트 Open  jar 파일만 실행했는데 서버가 동작하는 이유?SpringBoot 에는 톰캣(Tomcat)이 내장되어 있기 때문이다.톰캣(Tomcat)웹 애플리케이션 서버(WAS)의 한 종류로써, 요청이 들어오면 그 요청을 약속된 형식에 맞추어 스프링에 전달해준다.실행 중인 서버 중단ctrl + c./gradlew clean현재 빌드되어 있는 결과물 제거 foreground vs background foreground우리가 보고 있는 프로그램ex) PDF 프로그램이 foreground 프로그램 background우리가 보고 있지 않은데 실행중인 프로그램ex) 컴퓨터에서의 백신 프로그램 리눅스에서 background로 동작하게 만드는 명령어nohup [명령어] &nohup java -jar build/libs/library-app-0.0.1-SNAPSHOT.jar &rm nohup.out  background 서버 다운작업관리자 명령어ps aux : 현재 실행중인 프로그램 목록을 확인할 수 있다.ps aux | grep java : java가 들어가는 프로그램을 확인한다.kill -9 프로그램번호 : 해당 프로그램을 종료시킨다.파일의 내용물을 확인하는 방법파일에 직접 들어가 내용물 확인vi : 리눅스 편집기인 vim을 사용하여 파일을 접속한다. (ex. vi nohup.out)파일에 들어가지 않고 현재 접속중인 터미널을 활용하는 방법cat : 파일에 있는 내용물을 모두 출력하는 명령어(ex. cat nohup.out)파일 내용물의 양이 많지 않고, 실시간 업데이트가 잘 되지 않는 파일을 확인할 때 사용한다.tail : 현재 파일의 끝 부분을 출력하는 명령어tail -f : 현재 파일의 끝부분을 실시간으로 출력해준다.  과제 내용Day 6Controller, Service, Repository의 3단 분리 구조를 채택하여 백엔드 설계를 진행했습니다.Repository 클래스에서는 jdbcTemplate를 활용해 SQL문을 직접 작성하고 데이터베이스와 직접적으로 연결하는 방식을 택했습니다. 이 과정에서 @Repository 어노테이션을 활용한 생성자를 통한 의존성 주입이 이루어지는 것을 확인할 수 있었습니다.특히, 다양한 저장소 구현체(FruitMySqlRepository, FruitMemoryRepository)를 만들면서, @Primary 어노테이션을 활용하여 서비스 로직이 실행될 때 어떤 레포지토리 레이어를 우선적으로 사용할지 결정하는 방식을 경험했습니다. 이러한 구조적 접근은 유연하고 확장 가능한 백엔드 시스템을 구축하는 데 큰 도움이 되었습니다.📋 6일차 미션: 레이어 3단 분리 Day 7JDBCTemplate을 사용해 시스템을 구축한 DB를 성능 개선과 유지보수의 편의성을 위해 JPA로 전환하였습니다.엔티티 클래스인 Fruit에서는 과일의 이름, 입고 날짜, 가격, 판매 여부를 관리했습니다. JPA의 강력함은 FruitRepository 인터페이스를 통해 드러났다. 여기서 단순 조회부터 복잡한 조건의 데이터 처리까지 어노테이션 몇 개로 해결할 수 있었습니다. FruitServiceV2에서는 과일의 저장, 판매 상태 업데이트, 통계 조회 등 핵심 비즈니스 로직을 구현하여, 코드의 간결함과 효율성을 극대화했습니다.특히, 과일의 개수를 세거나, 특정 가격 이상 또는 이하의 과일을 조회하는 기능을 추가하며, JPA의 유연성과 편리함에 다시 한번 감탄했습니다. 이 모든 과정을 통해, 나는 JPA의 놀라운 잠재력을 경험하며, 보다 나은 소프트웨어 개발자로 성장할 수 있는 계기를 마련한 것 같습니다.📋 7일차 미션: JPA 구현회고SW 배포는 최종 사용자에게 소프트웨어를 전달하는 과정으로, 리눅스 기반 서버 컴퓨터에서 주로 이루어집니다. 개발 단계에서는 경량화된 H2 DB를 활용하여 데이터의 휘발성을 감안한 개발 환경을 구축합니다. Git과 GitHub을 통한 버전 관리 및 코드 저장소 활용은 코드 소실 방지와 효율적인 배포 과정을 지원합니다. EC2와 리눅스 명령어를 통한 서버 접속 및 관리, 그리고 리눅스 환경에서의 스프링 배포는 필수적인 프로세스라는 것을 알게 되었습니다.또한, Controller, Service, Repository의 3단 분리 구조를 채택하여 백엔드 설계를 진행하고, JDBCTemplate에서 JPA로 전환하여 성능 개선과 유지보수의 편의성을 높였습니다. 이 모든 과정은 유연하고 확장 가능한 백엔드 시스템 구축과 개발자로서의 성장에 밑거름이 된 거 같습니다.

백엔드인프런워밍업스터디클럽3주차회고록

채널톡 아이콘