본문 바로가기
728x90
728x90

전체 글191

넌 지금 전혀 util 하고 있지 않아. util이 util한가? 레벨1 사다리미션의 리뷰 중 이제껏 한번도 생각해보지 않았던 의문을 갖게 만든 리뷰가 있었다. 평소 아무 생각없이 utils 패키지를 만들고, 그 안에 Validator 클래스를 두어 검증로직을 관리했다. 사다리미션 역시 마찬가지의 방식으로 패키지를 구성했었다. 그리고 이에 대해 이번 리뷰어는 Validator 클래스가 정말 utils 패키지에 어울리는지에 대한 의문을 안겨줌과 동시에 utils 패키지의 역할에 대한 의문 또한 안겨주었다. 그냥 너무나도 흔하게 사용하고 자주 사용하다보니, util이란 패키지 또는 클래스에 대해 한번도 깊게 생각해본적이 없는 것 같다. 우테코는 나에게 정말 많은 의문들을 안겨준다. 해결은 내 몫이니 파고들어보자. 소프트웨어에서의 util util .. 2023. 3. 12.
[레벨1] 사다리게임 미션 회고 1단계 1단계 PR 1단계는 페어 프로그래밍으로 진행을 했다. 이전 미션 자동차경주 미션에서는 온보딩 팀 내에서 페어가 배정되었는데, 이번 미션에는 정말 쌩랜덤으로 배정이 된 듯하다. 내 페어는 코코닥이었다. 여기 저기 돌아 댕기면서 여러사람과 인사를 나눴다고 생각했었는데, 처음 보는 크루였다. 의견을 거리낌 없이 주고받기 위해 말을 놓고 편하게 지내자는 제안을 했다. 흔쾌히 승낙을 해준 코코닥과 의견을 나누며 기능구현을 시작했다. 새로만난 페어와 나는 코딩스타일이 많이 다른 편인듯 했다. 페어는 설계 부터 꼼꼼히 차근차근 진행하는 편이었고, 나는 머릿속으로 대충 그림을 그려놓고 코드부터 작성하는 편이다. 이제껏 내 방식에 의문을 품은 적이 없었는데, 페어프로그래밍을 진행하며 설계의 중요성을 깨닫게 되었.. 2023. 3. 1.
LinkedList에서 삭제된 노드의 next의 null 처리 할까 말까? 학습을 위해 작성된 포스팅 입니다. 잘못된 내용이 있으면, 지적해주세요! Linked List 미니미션 우테코 레벨1 사다리 미션 진행 중, LinkedList를 직접 구현해보는 미니미션이 하나 추가되었다...ㅎ (와.. 신난다...) 자료구조에 대한 선수지식이 없어서 제법 애를 먹었는데, 아주 멋진 크루 마코 에게 이런저런 질문을 하며, 얼레벌레 구현을 하는데는 성공하였다. 그런데 구현을 하던도중 한가지 의문점이 떠올랐다. null 처리 해줘야 하나..? 의문이 든 시점은 remove 기능을 구현하는 도중이었다. LinkedList 의 remove 는 위의 그림과 같은 방식으로 구현되는데, 삭제된 노드(C)의 next는 여전히 D를 가리키고 있다. C의 next를 null로 처리를 해줘야 할까..? 참.. 2023. 2. 24.
우리 당당하게 getter 씁시다! 학습을 위해 작성된 포스팅 입니다. 잘못된 내용이 있으면, 지적해주세요! 객체지향을 공부하다 보면, 한번쯤은 맞닥뜨리는 문장이 있다. getter/setter/property를 쓰지 않는다. 객체지향 생활체조 9번에 해당하는 내용이다. 이제껏 위의 문장을 성서에 나온 문구처럼 가슴속에 깊이 새기고, 왜에 대한 의문은 품지 않았다. (무교임) 최근에 반란군크루에 가입하게 되었는데, 반란군답게 "왜 안되는데?" 마인드로 한번 다가가보자. setter에 관한건 이미 너무 멋진 글이 있으니 참고하면 좋을 듯 하다. getter 왜 안쓰냐? getter를 지양하자. 가 중론이기 때문에 당당하게 getter씁시다! 를 외치기 위해선 왜 getter를 쓰면 안되는지 를 먼저 샅샅이 파악하고, 그 빈틈을 노려야 한다... 2023. 2. 21.
[CS] DB - 트랜잭션과 무결성 트랜잭션은 하나의 논리적 기능을 수행하기 위한 작업의 단위를 뜻한다. 즉, 여러개의 쿼리를 하나로 묶는 단위를 말한다. 트랜잭션의 ACID 특성이란? 원자성(Atomicity) 트랜잭션 중간에 어더한 문제가 새기면 트랜잭션에 해당하는 어떠한 작업내용도 수행되어서는 안되고, 아무런 문제가 없을 경우에는 모든 작업이 수행되어야 한다. 일관성(Consistency) 트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다. 고립성(Isolation) 각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야한다 지속성(Durability) 트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다. 무결성 무결성이란 데이터의 정확.. 2023. 2. 18.
[CS] DB - ERD와 정규화 ERD는 데이터 베이스를 구축할 때 가장 기초적인 뼈대 역할을 하며, 릴레이션간의 관계들을 정의한다. ERD의 중요성 시스템의 요구사항을 기반으로 작성되고, 이 ERD를 기반으로 데이터 베이스를 구축한다. DB 구축 이후에도 디버깅 또는 비즈니스 프로세스 재설계가 필요한 경우 설계도 역할을 하기도 한다. 관계형 데이터를 구성하는데는 유용하나, 비정형 데이터를 충분히 표현할 수 없다. 정규화 과정 정규화 과정은 릴레이션 간의 잘못된 종속관계로 인해 데이터베이스 이상현상이 일어나서 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러개로 분리하는 과정이다. 여기서 말하는 데이터 이상 현상이란, 회원이 한 개의 등급을 가져야 하는데 세개의 등급을 갖거나, 데이터 삽입 시, 하나의 필드값이 N.. 2023. 2. 18.
[CS] DB - 데이터베이스의 기본 데이터 베이스는 일정한 규칙또는 규약을 통해 구조화 되어 저장되는 데이터의 모음이다. 해당 데이터베이스를 제어, 관리하는 통합 시스템을 DBMS라고한다. DBMS마다 query를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있다. 또한, 데이터베이스는 실시간 접근과 동시 공유가 가능하다. 엔터티 엔터티는 사람,장소, 물건, 사건, 개념 등 여러개의 속성을 지닌 명사를 의미한다. 물론 현실세계에 있는 모든 개념을 속성으로 만드는 것이 아니라, 추상화 과정을 통해, 서비스의 요구사항에 맞춰 속성이 정해진다. 속성 속성은 릴레이션에서 관리하는 구체적이고 고유한 이름을 갖는 정보이다. 약한엔터티 강한엔터티 A가 혼자서는 존재하지 못하고, B의 존재 여부에 따라 종속적이라면 A는 약한 엔터티이고, B는 강한 .. 2023. 2. 18.
[Spring] 자동 의존관계 주입 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] 싱글톤 컨테이너 와 이어지는 포스팅입니다. 전체 소스코드 보기 다양한 의존관계 주입방법 의존 관계 주입의 방법은 크게 4가지가 있다. 생성자 주입 수정자 주입(setter) 필드 주입 일반 메서드 주입 생성자 주입 말그대로 생성자를 통해서 의존관계를 주입하는 방법이다. 이전의 포스팅에서 사용한 방법이 전부 생성자 주입이다. 특징으로는 생성자 호출 시점에 딱 한번만 호출되는것이 보장되고, 불변적이고 필수적인 의존관계에서 사용 된다는 점이다. 예제로 이전에 작성했던 OrderServiceImpl을 확인해보자. @Component public class OrderServiceImpl implements OrderService{ .. 2023. 2. 2.
[Spring] 컴포넌트 스캔 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] 싱글톤 컨테이너 와 이어지는 포스팅입니다. 전체 소스코드 보기 컴포넌트 스캔과 의존관계 자동 주입 이전 포스팅까지 스프링 빈을 등록할 때는 AppConfig 파일에 @Bean을 통해서 설정정보에 직접 등록할 스프링 빈을 작성했다. 근데 이거 귀찮다. 매우. 지금은 아주 간단한 예제코드를 작성하는 거기 때문에 별거 없네 라고 생각할 수 있지만, 실무에서는 수십, 수백개의 스프링빈을 등록해야 될거다. 근데 이렇게 된다면 당연하게도 누락되는 일도 생길거고, 설정정보도 지나치게 방대해지고, 가장 중요한건 귀찮다.. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이란 기능을 제공한다. 또한, 의존 관.. 2023. 2. 1.
[CS] OS - 메모리 메모리 계층 메모리계층은 레지스터, 캐시, 메모리, 저장장치로 구성되어 있다. 각각의 특징은 다음과 같다. 레지스터 : CPU안의 작은 메모리, 휘발성, 속도 가장 빠름, 용량 가장 적음 캐시 : L1, L2 캐시를 지칭한다. 휘발성, 속도 빠름, 용량 적음 주기억장치 : RAM을 가리킨다. 휘발성, 속도 보통, 용량 보통 보조기억장치 : HDD, SSD를 일컬으며, 비휘발성, 속도 낮음, 용량 큼 계층의 위로올라갈수록 가격은 비싸지고, 속도는 빨라지고, 용량은 적어지는 특징을 갖고 있다. 이러한 계층이 존재하는 이유는 경제성과 캐시 때문이다. 캐시 캐시는 데이터를 미리 복사해 놓는 임시 저장소이다. 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리를 말한다. 예로, 메모리와 .. 2023. 1. 31.
[Spring] 싱글톤 컨테이너 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] 스프링 컨테이너와 이어지는 포스팅입니다. 전체 소스코드 보기 웹애플리케이션과 싱글톤 웹 애플리케이션은 보통 여러고객이 동시에 요청을 한다. 만약 3명의 고객이 회원가입을 한다면, 각각의 요청마다 새로운 memberService 가 생겨날 것이다. 테스트 코드를 통해 확인해보자. public class SingletonTest { @Test @DisplayName("여러개의 멤버 서비스 생성 확인") void memberServiceTest() { AppConfig appConfig = new AppConfig(); MemberService memberService1 = appConfig.memberService(); Mem.. 2023. 1. 31.
[CS] OS - 운영체제와 컴퓨터 운영체제 운영체제란 컴퓨터 시스템을 효율적으로 관리하고, 사용자가 컴퓨터를 쉽게 다룰수 있게 해주는 인터페이스이다. 운영체제의 역할 CPU 스케줄링과 프로세스 관리 CPU소유권 할당과, 프록세스의 생성과 삭제, 자원 할당 및 반환을 관리한다. 메모리 관리 한정된 메모리를 어떤 프로세스에 얼만큼 할당해야 하는지 관리한다. 디스크 파일관리 디스크 파일을 어떠한 방법으로 보관할지 관리한다. I/O 디바이스 관리 I/O 디바이스(마우스, 키보드)와 컴퓨터 간에 데이터를 주고받는 것을 관리한다. 운영체제의 구조 운영체제의 구조는 아래와 같다. 운영체제를 크게 인터페이스(GUI)와 커널 2개의 부분으로 나눌 수 있다. 인터페이스 커널에 사용자 명령어를 전달하고, 사용자에게 실행결과를 알려주는 역할을 한다. ex) .. 2023. 1. 30.
[CS] 네트워크 - HTTP HTTP HTTP는 애플리케이션 계층에서 웹서비스 통신에 사용된다. 1.0 부터 시작하여 발전을 거듭해 현재는 HTTP/3에 이르렀다. HTTP/1.0 1.0은 기본적으로 한 연결당 하나의 요청을 처리하도록 설계되었다. 즉, 서버로 부터 하나의 파일을 가져올 때 마다, TCP의 3-way-handshake를 계속 열어아한다는 뜻이다. 이로인해, RTT가 증가하는 문제가 발생했다. RTT Round Trip Time의 약자로, 패킷이 목적지에 도달하고 나서, 다시 출발지로 돌아오기 까지 걸리는 왕복 시간. RTT 해결책 이미지 스플리팅 작은 아이콘들을 각각의 이미지 파일로 만들게 되면, 과부하가 걸리기 때문에 사용하는 방식이다. 위의 이미지 처럼 아이콘들을 하나하나 분리한 파일로 사용하는 것이 아니라, 하.. 2023. 1. 24.
[CS] 네트워크 - IP 주소 IP 주소 IP주소란 말그대로 IP가 목적지를 판단하기 위해 사용하는 '컴퓨터의 주소'를 의미한다. 당연한 소리겠지만, 중복되는 IP주소를 갖고 있는 컴퓨터가 존재한다면, 목적지를 판단하기 위한 IP주소의 역할을 제대로 수행할 수가 없을 것이다. 그렇기 때문에 번호의 중복을 피하기 위해 ICANN이라는 기관이 중심이 되어 전세계의 IP주소를 관리하고 있다. TCP/IP 계층에 대한 내용을 작성하면서 IP는 인터넷(네트워크) 계층에서 하나뿐인 중심적인 프로토콜이라 했는데, IP가 사용하는 IP주소에 대해 조금더 자세히 알아보자. ARP ARP는 인터넷계층에서 사용되는 프로토콜 중 하나로, IP의 보조적인 역할로 사용된다. 컴퓨터와 컴퓨터 간의 통신은 IP로 이뤄진다고 생각하지만, 사실은 IP주소에서 ARP.. 2023. 1. 20.
[Spring] 스프링 컨테이너 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. [Spring] DI와 IoC 그리고 컨테이너와 이어지는 포스팅입니다. Spring 컨테이너로 변경 이전 포스팅에서 순수 Java로 DI 컨테이너를 Spring 컨테이너로 변경하는 작업을 해볼거다. 그리고 스프링컨테이너에 등록된 객체들을 조회하는 방법도 알아보려 한다. 전체코드는 깃헙에 올라가있음 AppConfig 우선 AppConfig 를 수정해보자. @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberReposi.. 2023. 1. 19.
[CS] 네트워크 - 네트워크 기기 네트워크 기기의 처리범위 네트워크는 여러개의 네트워기 기기를 기반으로 구축된다. 네트워크 기기는 계층별로 처리범위를 나눌 수 있다. 상위 계층을 처리하는 기기는 하위 계층을 처리할 수 있지만, 하위계층을 처리하는 기기는 상위 계층을 처리할 수 없다. 에를 들자면, 애플리케이션 계층을 처리하는 기기는 그 밑의 모든 계층의 프로토콜을 처리할 수 있지만, 물리계층을 처리하는 기기는 다른 계층의 프로토콜을 처리할 수 없다. 스위치 스위치(Switch)란 패킷을 수신부로 보내는 역할(Switching)을 하는 기기이다. 이 때, 패킷의 어떠한 정보를 바탕으로 수신부를 판단하는지에 따라 계층이 나뉘어진다. 스위치의 종류는 L1, L2, L3, L4, L7 이 있다. OSI 7계층 모델에서 어떠한 계층에 사용되는지에.. 2023. 1. 18.
[CS] 네트워크 - TCP/IP TCP/IP 인터넷 프로토콜 스위트(Internet Protocol Suite)는 인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 통신규약(프로토콜)의 모음이다. 인터넷 프로토콜 슈트 중 TCP와 IP가 가장 많이 쓰이기 때문에 TCP/IP 프로토콜 슈트라고도 불린다. 즉, TCP/IP란 전 세계적으로 가장 많이 사용되는 공통된 통신 프로토콜 이다. 프로토콜 데이터를 주고 받기 위해 송신측과 수신측의 컴퓨터가 미리 정해놓은 공통된 메뉴얼 TCP/IP 4계층 TCP/IP에서는 송수신과 관련된 일련의 작업을 몇개의 단계로 나눠서 수행한다. 각 단계를 계층(layer)이라고 한다. 각각의 계층들은 프로토콜의 네트워킹 범위에 따라 네개의 추상화 계층으로 구성된다. OSI 가장 널리 사용되는 네트워크 모델 .. 2023. 1. 18.
[CS] 네트워크 - 네트워크의 기초 네트워크란 네트워크란 노드와 링크가 서로 연결되어, 리소스를 공유하는 집합을 의마한다. 노드란 서버, 라우터, 스위치 등 네트워크 장치를 의미한다. 링크 유선 또는 무선을 의미한다. 좋은 네트워크란? 네트워크를 구축 할때는 좋은 네트워크로 만드는 것이 중요한데, 여기서 말하는 좋은 네트워크란, 많은 처리량을 처리할 수 있고, 지연시간이 짧고, 장애빈도가 적으며, 좋은 보안을 갖춘 네트워크를 의미한다. 처리량(throughpur) 링크를 통해 전달되는 단위 시간당 데이터양 단위로는 bps(bits per second)를 사용한다. 트래픽, 대역폭, 에러, 하드웨어 스펙에 영향을 받는다. 지연시간(latency) 요청이 처리되는 시간을 의미한다. 어떤 메세지가 두장치 사이를 왕복하는데 걸린시간을 의미한다. .. 2023. 1. 16.
[Spring] DI와 IoC 그리고 컨테이너 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성하였습니다. DI DI는 의존성 주입(Dependency Injection)이란 뜻으로, 의존 관계를 외부에서 결정 하여 주입한다는 의미 이다. 의존관계란? A클래스와 B클래스가 있을 때, B클래스의 변경이 A클래스에 영향을 미칠 때 A는 B와 의존 관계라고 한다. DI를 통해 모듈간의 결합도가 낮아지고 유연성이 높아진다. IoC IoC는 제어의 역전(Inversion of Control) 이라는 의미이다. 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다. 대부분의 프레임워크에서 사용하는 방식이다. 덕분에 개발자는 프레임워크에 필요한 부품을 개발하고, 조립하는 방식의 개발을 하게 된다. 이렇게 조립된 코드의.. 2023. 1. 16.
[Spring] 스프링의 역사 EJB의 몰락 옛날 옛적에는(2000년 초반) EJB라는 기술이 있었고, 이게 Java 진영의 표준이었다. 당연하게도 금융권을 포함한 모든 곳에서 널리 사용 되었고, EJB이외의 오픈 소스들은 사파로 취급당했다. 그런데 EJB는 이론적으로는 굉장히 뛰어난 기술이었지만, 실제 사용하는 개발자들에게는 한숨메이커 였다고 한다. 일단 비쌌고, EJB에 굉장히 종속적으로 프로그래밍 할 수밖에 없어 객체지향적인 설계가 불가능했고, 테스트를 하기에도 힘들거나 아예 불가능 했다고 한다. 게다가 느리기까지. 총체적 난국이었다. 이외에도 여러 단점들이 있었다고 하는데, 그래도 어쩌나 이거 안쓰면 사파 취급당하니.. 눈물을 머금고 어거지로 썼다고 한다. 그러다가 참다 참다 폭발한 두명의 개발자가 판을 흔들기 시작한다. Hi.. 2023. 1. 11.
728x90
728x90