블로그
전체 7#카테고리
- 데브옵스 · 인프라
- 백엔드
#태그
- 워밍업클럽
- 인프런
- 스터디
- 4기
- 데브옵스
- Devops
- 일프로
- 쿠버네티스
- k8s
- 발자국
- 인프라
- 백엔드
- 워밍업
- 워밍업3기
2025. 06. 21.
1
[인프런 워밍업 클럽 4기] 4주차 발자국
이번주 학습 내용Helm vs Kustomize의 차이를 이어서 학습했다.Helm은 Chart로 환경별 설정이 가능하여 관리가 용이한 점kustomize는 기존 설정을 overlay로 A+B를 결합하는 형식이어서 조금 더 직관적인 느낌만약 처음 선택을 해야 한다면 서비스의 갯수에 따라서 Helm과 kustomize에 대해서 고민할 것 같다. 관리해야 하는 서비스가 많을 수록 kustomize가 주는 장점이 오히려 관리 포인트가 되어 단점이 될 수 있다고 생각이 들고, Helm이 주는 장점이 더 두각되는 것 같다.ArgoCD의 동작방식에 대해서는 아직 학습이 덜되어서 다시 한번 학습이 필요할 것 같다.회고마지막 발자국이라는 것이 믿기지가 않는다, 직장, 학업으로 매주 힘들었지만 같이 해준 팀원 분들에게 너무 감사하고, 좋은 분들을 만날 수 있어서 감사했다. 또한 중간점검을 통해 강사님이 강의에 투자하는 시간을 알게되었는데 높은 품질의 강의는 확실히 다른다는 것을 알게 되었고, 양질의 내용을 제공해주기 위해 준비해주신 강사님께도 감사하다.스터디는 이번주에 종료되지만 여기서 멈추는 것이 아니라 내것으로 만들기 위해 복습하는 시간을 가지려고 한다.💪💪
데브옵스 · 인프라
・
워밍업클럽
・
인프런
・
스터디
・
4기
・
데브옵스
・
Devops
2025. 06. 15.
1
[인프런 워밍업 클럽 4기] 3주차 발자국
이번주 학습 내용이번주는 Devops의 역할, 배포 방법, 쿠버네티스 패키지 매니저(Helm)에 대해서 학습했다.아무래도 개발자이다 보니, 위 그림을 인상 깊게 보았는데, 내가 경험해온 Devops 엔지니어 분들은 개발 영역은 하지 않으셨고, 개발 부분은 개발자가 맡아서 하는 R&R이 확실하게 분리된 환경에서 업무를 해왔는데, 결국 나의 능력을 높이기 위해서는 개발 + 인프라까지 다룰 수 있어야 하는 건 맞는 것 같다. ( AI가 무섭게 성장하고 있는 흐름에서는 더더욱...! )그리고 추후 PM/PL/아키텍트 역할을 맡게 되었을때도 전체적인 그림을 볼 수 있어야 하기 때문에 전문가처럼 깊게는 아니더라도 전체적인 흐름은 알고 있어야 할 것 같다. 사실 이미지를 보자마자 놀랬다🤣🤣이 많은 내용을 다 알고 있어야 한다고?! 생각했는데 강사님께서 스탭별로 진행하면 된다고 말씀주셔서 다행이었다...나는 인프라는 곧 비용이다. 라고 생각하는데, 인프라 환경에 필요한 장비 또는 클라우드 비용이 매섭기 때문이다.회사의 지갑 사정에 따라서 또는 회사의 투자 상황에 따라서 인프라 환경도 달라질 것인데, 각 재정 상황에 맞는 파이프라인을 구축하면 되는 것 같다. 배포 방식에서는 Recreate / RollingUpdate / Blue&Green / Canary 이렇게 4개의 종류를 배웠는데, 가장 좋은 건 역시 Canary인 것 같다. (서비스는 죽으면 안되니까!)다만 이것도 결국 쿠버네티스를 얼마나 다룰 수 있는지 역량에 따라서 달라질 것 같다. Canary 배포 중 가중치가 안바뀐다거나? / 배포가 실행이 안된다거나?-> 여러 상황에 대해서 수동으로 처리할 수 있게 대응이 필요할 것 같다.)또한 서비스의 특징에 따라서도 어떠한 배포 방식을 선택할지 달라질 것 같다. 무중단이 아닌 운영시간이 정해진 서비스라면?-> 꼭 Canary 배포 방식을 선택하지 않아도 될 것 같다.회고요즘 퇴근 후 저녁에 3km 러닝을 하고 있는데, 러닝을 하면서 느끼는 것이 무엇이든지 단번에 되는 것이 아닌 절대적인 시간이 필요하고, 그 시간을 인내하고 꾸준히 달리는 것이 중요한 것 같다.학습도 마찬가지라는 생각이 든다. 어떠한 지식을 단번에 학습하려고 하지 말고, 천천히 꾸준히 학습하는 것이 중요한 것 같다.저번주 발자국에 일프로님께서 댓글을 달아주셔서 얼마나 놀랬는지 모르겠다ㅎㅎㅎ 이번 스터디는 완주를 목표로 학습하고, 추후에 꼭 복습해야겠다. 항상 디스코드 스레드 보면서 힘을 얻어갑니다! 마지막 4주차까지 파이팅!💪💪
데브옵스 · 인프라
・
Devops
・
일프로
・
워밍업클럽
・
인프런
・
4기
・
데브옵스
・
쿠버네티스
・
k8s
2025. 06. 08.
1
[인프런 워밍업 클럽 4기] 2주차 발자국
이번주 학습 내용이번주는 Probe, Secret, ConfigMap, PVC/PV, Deployment, Service, HPA, Cmponent 등을 배웠다.Probe는 앱의 상태를 체크할때 사용하는데, 앱의 로딩 시간에 따라서 Probe 설정을 정말 잘해주어야 하고, 외부 트래픽을 처리할지도 Probe에서 관리하기 때문에 중요도가 매우 높은 부분이라는 것을 배웠다.Secret, ConfigMap에서는 Secret이 암호화를 대신 해주는 것이 아닌 Base64 인코딩을 지원하는 것이고, ConfigMap을 통해서 앱에서 사용할 환경변수를 주입할 수 있었다.PVC/PV, Deployment, Service, HPA는 모두 중요한 포인트인 것 같은데 파일 스토리지 연동, 배포 방법에 따른 차이와 설정 방법, 내부/외부 트래픽에 대한 처리, 스케일 아웃 처리 등 운영 환경에서 적재적소에 사용하려면 해당 오브젝트들을 잘 이해하고 있어야 한다는 것을 배웠다.( 그렇지만 아직 한번에 이해가 가지는 않는 중이다. 실제로 실습하면서 컨테이너 내부에서 실행해야 되는 명령어인데, 호스트에서 진행해서 왜 안되는거지? 확인하는 시간도 적지 않게 있었다... 정말 많은 학습이 필요한 것 같다.) 이번주 미션 진행[미션2] Application 기능으로 k8s 이해 - Probe[미션3] Application 기능으로 k8s 이해 - Configmap, Secret[미션4] Application 기능으로 k8s 이해 - PV/PVC, Deployment, Service, HPA회고이번주는 미션이 3개가 있어서 정말 바빴던 것 같다... (공휴일도 2일이나 있었는데 ^^;;)정말 나만 힘든 건가? 라는 생각이 들었는데, 팀원 분들도 다들 힘들어 하시는 것 같았다. 그래도 다같이 으쌰!으쌰! 하는 분위기여서 나도 모르게 힘이 나는 것 같고, 모난 부분 없이 열정있고 긍정적인 팀원 분들을 만난 것이 너무 감사하다.아직은 쿠버네티스의 모든 것이 이해가지 않는 것이 당연하다고 생각한다.모든 내용을 한번에 다 이해한다면 누구나 상위 1%가 되었겠지만 실제로는 그렇지 않은 것 처럼 지속적으로 학습할 수 있는 습관이 중요한 것 같다.
데브옵스 · 인프라
・
데브옵스
・
인프런
・
워밍업클럽
・
4기
・
일프로
・
Devops
・
발자국
2025. 06. 01.
1
[인프런 워밍업 클럽 4기] 1주차 발자국
이번주 학습 내용실무에 적용하고 싶은 쿠버네티스섹션3. 컨테이너 한방 정리에서 리눅스의 역사부터 도커의 탄생, 쿠버네티스까지 전체적인 흐름을 알 수 있었다.섹션5. 실무에서 느껴 본 쿠버네티스가 정말 편한 이유 에서 정말 쿠버네티스의 기본적인 기능들만 확인했는데, 너무 마음에 들었다. 어느정도 마음에 들었냐면 "당장 실무에서 쓰고 싶다!" 라는 생각이 들었다.매번 VM(EC2)에 JDK 설치하고, 프로메테우스 설치하고, 뭐 누락된거 없는지 체크리스트 확인하고 수동으로 작업했어야 했는데, 거기다 이중화 해야 한다고 하면 VM 하나 더 수동으로 똑같은 작업을 해야 하는데 이게 작업자가 다르거나 체크리스트를 만들지 않으면 환경이 전혀 달라질 수 있다!그런데!! 쿠버네티스는 수동으로 했던 모든 작업을 replica 수만 조정하면 바로 VM 한대가 똑같이 생성된다.이번주 미션 진행[미션1] 쿠버네티스 설치 구간별 상태 확인고민되었던 부분강의를 예전에 듣고 구성해둔 환경이 있었어서, 그대로 사용하려고 하였는데 아래 명령어가 갑자기 안되었다.yum install -y ...그래서 왜 안되는건지 찾아보았는데 NTP 설정을 맞춰주어야 한다고 한다.( 아마 현재 서버가 2024년도여서 yum install 시간과 맞지 않아서 그런것 같다 )sudo timedatectl set-ntp trueNTP 설정을 맞추니까 현재 시간으로 맞춰진 것을 확인했는데! 이번엔 kubectl에서 pod들이 연결이 모두 안되었다. 로그를 확인해보니 인증서가 만료되었다는 것!Jun 01 11:46:22 k8s-master kubelet[1161]: E0601 11:46:22.568529 1161 bootstrap.go:266] part of the existing bootstrap client certificate in /etc/kubernetes/kubelet.conf is expired: 2025-05-24 17:34:19 +000>NTP를 오늘 날짜로 맞춰서 인증서의 날짜보다 지나있기 때문에 만료 되었다고 한다,.동작방식은 제대로 문서를 봐야겠지만, k8s 내부에서 통신을 할때 TLS 통신을 하는 것 같다. 그래서 같은 인증서로 통신을 하는데 만료되어서 통신이 안되고 있는 것으로 예상되어 인증서를 갱신 해주었다.sudo kubeadm certs renew all인증서는 갱신되었지만 여전히 kubeadm은 실행이 되지 않았다, 아마 kubectl 뿐만 아니라 연관된 서비스들도 같이 인증서를 갱신해주어야 하는 것 같은데! 시간이 너무 소요될 것 같아서😢 kubeadm을 새로 설치해주었다.( 삭제하면 namespace들도 모두 삭제되어서,, 다시 설치해주어야 한다. dashboard, calico, grafana... 등)회고정말 쿠버네티스 설치가 너무 힘들고 2번은 못하겠다는 생각도 들고,, 하지만 운영 관점에서는 안정성과 확장성 부분에서 너무 좋은 것 같다.일프로님께 AWS/GCP/Azure 등 클라우드 벤더사에서 제공하는 k8s 서비스를 사용해도 이렇게 설치 과정을 거치는지 궁금해서 여쭤드렸다.일프로님 답변클러스터에 이슈가 발생하면 설치 과정을 이해하고 있어야 한다고 말씀주셨다!복습할 수 있는 시간이 주어진다면 꼭 다시 봐야겠다!
데브옵스 · 인프라
・
데브옵스
・
인프라
・
Devops
・
인프런
・
워밍업클럽
・
4기
2025. 03. 23.
0
[인프런 워밍업 클럽 3기] 3주차 발자국
이번주 학습 내용포트폴리오를 관리할 수 있는 관리자 페이지 개발 진행강의를 수강하면서 포트폴리오 부분과 코드가 크게 달라지는 부분은 없어서 진행시 어려운 부분은 크게 없었던 것 같습니다.조금 더 찾아볼 주제는 CASCADE 옵션을 공부해보려고 합니다, 현재 회사에서는 CASCADE 옵션을 사용하는 곳은 없는데 강의에서는 사용하고 있어서 언제 사용하는지, 왜 사용하는지, 장점은 무엇인지, 단점은 무엇인지 알아보려고 합니다.관리자 페이지의 부트스트랩 템플릿이 유료화되버린 이슈가 있어서 차주에는 관리자 페이지 FE보다는 개인 프로젝트에 대한 비중을 높이려고 합니다.이번주 미션 진행[미션4] 조회 REST API 만들기[미션5] 삽입, 수정, 삭제 API 만들기고민되었던 부분미션5에서 삽입, 수정 부분에서 고민되는 부분이 있었는데, 상대방을 서로 라이크한 경우에는 매치 케이스이므로 매치 테이블에도 삽입해주어야 하는 것은 맞는데 만약 매치를 취소한 경우 스와이프도 같이 취소를 해야하는 것인지 고민이 되어 해당 부분을 작성하지 못했습니다. 😢 초반 설계가 정말 중요한 것 같습니다!회고플러터 앱 스터디도 같이 진행 중이었는데 매일 2-3시에 자다보니 주말에 잠을 몰아서 자버렸다😢이제 플러터 앱 스터디는 종료가 되어서 남은 한 주 동안은 워밍업 클럽에 집중 해줘야지 (백엔드가 본업이야!!)수료까지 한 주 남았는데 남은 한 주도 내 자신이 최선을 다했으면 좋겠다! 💪💪
백엔드
・
백엔드
・
워밍업클럽
・
워밍업
・
워밍업3기
2025. 03. 16.
0
[인프런 워밍업 클럽 3기] 2주차 발자국
이번주 학습 내용DTO 사용하는 이유JPA를 이용해서 Entity를 조회 후 바로 클라이언트에 전달하는 것은 좋지 않다.왜 좋지 않을까?클라이언트에 불필요한 정보 포함Entity에는 테이블의 정보를 모두 가지고 있기 때문에 클라이언트 화면에 필요한 정보보다 더 많은 정보를 넘겨주게 되면 클라이언트에서도 해당 화면에 필요한 정보가 명확하게 무엇인지 어려워 유지보수 및 트래픽 부분에서도 이슈가 있을 수 있다.보안성Entity에 있는 정보를 모두 클라이언트에게 전달하게 되면, 노출되면 안되는 개인정보가 네트워크 트래픽상에 노출될 수 있어 보안 부분에서 이슈가 발생할 수 있다. Open-Session-In-View (OSIV) 문제스프링 JPA에서 영속성 컨텍스트에서 Entity 조회시 Controller까지 해당 Entity를 전달하게 되면 해당 영속성 컨텍스트의 트랜잭션이 종료되지 않기 때문에 개발자가 의도하지 않은 데이터의 변경이 발생할 수 있음. 그러면 비즈니스에 크리티컬한 부분이 되기에 open-session-iv-view 옵션을 false로 설정하고 서비스 단에서 DTO로 변환하여 전달하는 것이 좋다. 레포지토리 성능 개선스프링 JPA를 이용한 조회의 문제점 (N+1)단일 테이블 조회시에는 이슈가 없으나 연관된 Entity를 조회시에는 의도하지 않게 N+1의 쿼리를 실행하게 되는데, 데이터 개수가 적을때는 이슈가 없을 수 있으나 개수가 많아질 수록 N의 값이 커지기 때문에 성능 이슈가 발생할 수 있다. 어떻게 해결할 수 있을까?JPQL의 fetch join 사용 @Batchsize(size) 어노테이션 활용Lazy 로딩시 IN절로 조회되는 데이터의 사이즈를 지정할 수 있다.테스트 코드실무에서 테스트코드는 매우 중요하다.내가 변경한 곳은 1개의 라인일지라도 해당 라인의 영향도는 알 수 없기 때문이다. ( 프로젝트 규모에 따라 다르지만 ㅎㅎ )기존의 비즈니스 로직도 동일하게 동작하면서 내가 변경한 기능도 정확하게 동작하는지 확인하기 위해서는 배포하고 직접 화면을 확인하는 방법도 있지만 테스트 코드를 작성하면 코드 레벨에서 기능을 체크할 수 있다.테스트 코드 작성방법given - when - then테스트 코드 관련 어노테이션@DataJpaTest : 레포지토리 테스트Mockito 사용 : 단위 테스트에 사용@SpringbootTest 사용SpringbootTest는 스프링 컨테이너가 실행되어서 동작되므로 많은 테스트 코드 진행시 Mockito보다 속도가 느릴 수 있다.이번주 미션 진행[미션3] API 설계하기이번 미션은 API 설계였는데 Restful하게 설계하려니 고민되는 부분이 있었고, 무엇보다 문서 작성이 힘들었다.Github에서 관리하면 이력관리가 될 것 같아서 Github wiki에 정리하였는데 마크다운으로 작성하려니 직관적이지 않고, 반복되는 패턴들인데도 복사/붙여넣기 하는 과정이 있어 불필요하게 작성되는 느낌을 받았다.추후에는 Spring docs로 코드레벨에서 API 명세를 관리할 수 있게 개선 해야할 것 같다.회고멘토님께서 이번주 중간 점검 미팅때 QnA를 진솔하게 해주셔서 감사했다.JPA의 성능이슈에 대해서 고민하다가 이렇게 JPQL을 써야한다면 JPA만으로는 실무의 모든 쿼리를 대체할 수는 없을 것 같다. Mybatis + JPA의 구조를 택하는 이유도 네이티브 쿼리의 니즈가 있어서 아닐까 싶다.요즘 회사에서 MSA 프로젝트 유지보수를 맡게되어서 코드 분석을 빡세게 하고 있고, 퇴근 후에는 운동, 플러터 스터디도 같이 진행하고 있어서 주변에서 일정을 들으면 놀라긴 하는데, 새로운 것을 배우는 재미가 있어서 그런지 아직까지는 버티면서 할만 한 것 같다.
백엔드
・
백엔드
・
워밍업클럽
・
인프런
2025. 03. 09.
0
[인프런 워밍업 클럽 3기] 1주차 발자국
이번주 학습 내용웹 기본 개념3-tier-architecture클라이언트 / 서버 / 데이터베이스웹 프레임워크와 Spring Framework프레임워크를 사용하면 웹 개발에 필요한 공통적인 기능들을 편리하게 구현할 수 있다디자인 패턴MVC 패턴Model: 데이터를 담는 역할View: 사용자에게 보여지는 화면 담당Controller: 사용자의 요청과 응답을 처리레이어드 아키텍처 (layerd-architecture)Controller: 클라이언트 요청과 응답을 처리Service: 비즈니스 로직에 맞게 데이터 처리Repository: 데이터베이스에 접근하여 데이터 요청스프링 프레임워크 의존성 주입생성자 주입생성자가 호출될때 주입setter 주입setter 메서드를 호출하여 주입필드 주입필드에 @Autowired 사용코틀린 문법class Table( // 주생성자 // 주생성자의 파라미터와 프로퍼티를 지정한다. var arg: String, val arg2: Int ) { // 프로퍼티 var arg3: String }JPA@Entity테이블과 매핑할 클래스를 지정하며, JPA가 관리한다.기본 생성자를 필수로 한다.@GenerateValue키 생성 전략IDENTITY 전략기본 키 생성을 데이터베이스에 위임하는 전략 / MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.insert 후 기본키를 받아올 수 있다. 데이터베이스와 1번 통신한다.SEQUENCE 전략데이터베이스의 유일한 값을 순서대로 생성 / 시퀀스를 지원하는 DB에서 사용이 가능하다. Oracle, PostgreSQL시퀀스를 조회 후 / insert를 실행하기 때문에 데이터베이스와 2번 통신한다.TABLE 전략키 생성 전용 테이블을 생성하여, 마치 데이터베이스의 시퀀스를 사용하는 것처럼 할 수 있다.테이블만 생성하면 모든 데이터베이스에서 사용이 가능하다.@Enumlatedenum 타입을 매핑할 때 사용한다.EnumType.ORDINAL : enum의 순서를 저장한다.EnumType.STRING : enum의 이름을 저장한다.ORDINAL을 사용할 경우 순서가 바뀌면 데이터의 정합성이 깨질 수 있기 때문에 되도록 STRING 사용을 권장한다.@MappedSuperclass@Entity는 실제 테이블과 매핑되지만 @MapperSuperclass는 실제 테이블과 매핑되지 않는다. 단순하게 매핑정보를 상속하는 목적으로 사용된다.왜 abstract class로 지정할까?? abstract class가 아닌 일반 class로 지정하여도 동작에는 문제는 없어서 왜 abstract class로 지정하는지 찾아보니 MappedSuperclass는 매핑 정보만 제공하려는 목적이기 때문에 해당 클래스를 직접 생성해서 사용하는 일은 없으므로 abstract class로 지정한다고 한다.이번주 미션 진행[미션1] 깃허브 리포지토리에 프로젝트 올리기[미션2] 테이블 설계하기회고직장, 운동, 공부를 병행 하려니까 시간 분배가 쉽지 않은 것 같습니다😢생각보다 미션과 발자국이 제출해야 하는 마감일이 있어 다음주는 출퇴근 시간에 강의를 들으려고 합니다.코틀린과 JPA도 처음 사용하다보니 모르는 것이 많아서 정리하는 시간이 소요되는 것 같아 궁금한 부분은 그때그때 정리해 두려고 합니다.무사히 완주하는 것을 목표로 달리겠습니다!
백엔드
・
인프런
・
백엔드
・
워밍업
・
워밍업클럽
・
발자국