문득 궁금했던 개념 메모장
- 1. 트랜잭션
- 2. API
- 3. 디버깅
- 4. 프레임워크와 라이브러리
- 5. DI(Dependency Injection)
- 6. TCP와 UDP
- 7. 서블릿
- 8. 애플리케이션 컨텍스트
- 9. 객체지향프로그래밍과 절차지향프로그래밍
- 10. AOP
- 11. 클래스, 객체, 인스턴스
1. 트랜잭션
데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미
2. API
- 사전적 개녕 : 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
- API는 어떤 서버의 특정한 부분에 접속해서 그 안에 있는 데이터와 서비스를 이용할 수 있게 해주는 소프트웨어 도구
- 쉽게 말하면, API는 프로그램들이 서로 상호작용하는 것을 도와주는 매개체
- 식당을 예로 들면, API는 손님(프로그램)이 주문할 수 있게 메뉴(명령 목록)를 정리하고, 주문(명령)을 받으면 요리사(응용프로그램)와 상호작용하여 요청된 메뉴(명령에 대한 값)을 전달하는 역할
REST API
- REST는 네트워크를 통해서 컴퓨터들끼리 통신할 수 있게 해주는 아키텍처 스타일을 의미
- REST API는 클라이언트-서버 모델로 구축된 것을 의미하며, 정보의 페이로드(실제 전달하려는 내용)이 두 지점 사이를 왕복
- REST는 웹에 최적화되어 있고, 데이터 포맷이 JSON이기 때문에 브라우저들간의 호환성이 좋아 성능과 확장이 뛰어남.
3. 디버깅
컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적인 연산(버그)를 찾아내고 그 원인을 밝히고 수정하는 작업 과정을 의미한다.
4. 프레임워크와 라이브러리
프레임워크
프레임워크는 뼈대나 기반구조를 뜻한다. 프로그래밍을 진행할 때 필수적인 코드, 알고리즘 등과 같이 어느 정도의 구조를 제공해주기 때문에 프레임워크를 사용하는 프로그래머는 이 프레임워크라는 뼈대 위에서 코드를 작성하여 프로그램을 개발한다. 즉, 프레임워크는 완성된 제품이 아닌 완성된 제품을 만들기 위해서 개발자를 도와주는 기반이 되는 역할을 한다.
라이브러리
라이브러리는 특정 기능에 대한 도구 또는 함수들의 집합이다.
둘의 차이점
흐름을 누가 지니고 있느냐에서 차이가 있다. 프레임워크는 전체적인 흐름을 자체적으로 가지고 있어 프로그래머는 그 안에서 필요한 코드를 작성하지만, 라이브러리는 프로그래머가 전체적인 흐름을 가지고 있어 라이브러리를 자신이 원하는 기능을 구현하고 싶을 때 가져다 사용할 수 있다.
즉, 전체적인 흐름을 프레임워크는 자체적으로, 라이브러리는 사용자가 가지고 있다고 볼 수 있다.
5. DI(Dependency Injection)
스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능 으로, 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입시켜주는 방식 을 의미한다. DI를 통해서 모듈 간의 결합도가 낮아지고 유연성이 높아진다.
조금 더 상세하게 설명하면, DI란 IOC 컨테이너가 개발자 대신 정의된 대로 Bean 객체를 생성하고 의존성을 대신 주입하는 것을 의미한다. 여기서 IOC 컨테이너란 사용자가 작성한 메타데이터(xml, @애노테이션)에 따라 Bean 클래스 생성 및 관리하는 Spring의 핵심 컴포넌트이다.
참고로, IOC란 제어의 역전이라는 말로 사용자가 직접 객체를 생성하고 관리하던 것을 Spring의 IOC 컨테이너가 대신한다는 의미의 말이다.
DI를 사용하는 이유
- 높은 재사용성
- 테스트에 용이 -> 내부에서 직접 생성하는 객체에 대해서는 mocking 할 방법이 없어 단위 테스트가 어렵기 때문
- 종속성(결합력)이 낮아지기 때문에 code의 변경이 쉽고 유연성과 확장성을 향상
- 디자인패턴(싱글톤, 팩토리 등)을 구현하지 않고, 객체를 효율적으로 생성해 사용 가능
6. TCP와 UDP
전송계층은 송신자와 수신자를 연결하는 통신서비스를 제공하는 계층으로 데이터의 전달을 담당한다. 데이터를 보내기 위해 사용하는 프로토콜이 TCP와 UDP이다.
TCP
TCP는 인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜(규약)이다.
일반적으로 TCP와 IP는 함께 사용되는데, IP가 데이터의 배달을 담당한다면 TCP는 패킷을 추적하고 관리한다.
특징
- 연결형 서비스로 가상 회전 방식을 제공
- 3-way handshaking과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제
- 높은 신뢰성을 보장
- 흐름 제어 및 혼잡 제어
- UDP보다 속도가 느림
- 전이중(Full-Duplex), 점대점(Point to Point) 방식
가상 회선 방식을 제공한다는 것은 발신지와 수신지를 연결하여 패킷을 전송하기 위한 논리적 경로를 배정한다는 의미이다. 3-way-handshaking 과정은 목적지와 수신지를 확실히 하여 정확한 전송을 보장하기 위해서 세션을 수립하는 과정을 뜻하는데 이를 통해 신뢰성을 보장하고 흐름 및 혼잡을 제어할 수 있지만 속도에 영향을 주어 UDP보다 속도가 느리다. 즉, 연속성보다는 신뢰성있는 전송이 중요할 때 사용하는 프로토콜이다.
UDP
UDP는 데이터를 데이터그램 단위로 처리하는 프로토콜(규약)을 의미한다. 데이터그램이란 독립적인 관계를 지니는 패킷을 의미한다.
특징
- 비연결형 서비스로 데이터그램 방식
- 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않음
- UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출
- 신뢰성이 낮지만 속도가 빠름
비연결형 서비스이기 때문에, 연결을 설정하고 해제하는 과정이 존재하지 않는다. 즉, 연결을 위해 할당되는 논리적인 경로가 없기 때문에 각각의 패킷은 다른 경로로 전송되고 독립적인 관계이기 때문에 데이터를 서로 다른 경로로 독립적으로 처리하게 된다.
cf) 패킷이란
인터넷 내에서 데이터를 보내기 위한 경로배정(라우팅)을 효율적으로 하기 위해서 데이터를 여러 개의 조각들로 나누어 전송을 하는데 이때, 이 조각을 패킷이라고 한다.
cf) TCP의 패킷 추적 및 관리 방식
데이터는 패킷단위로 나누어 같은 목적지(IP계층)으로 전송된다. 예를 들어 A,B,C가 순서대로 목적지에 도착해야 한다고 가정했지만 B가 분실되어 A,C만이 도착지에 도착했을 때 목적지에서는 B가 필요한지 모르고 A,C만 보고 다 왔다고 생각할 수 있다. 때문에 A,B,C라는 패킷에 1,2,3이라는 번호를 부여하여 패킷의 분실 확인 처리를 통해 목적지에서 재조립을 한다. 이런 방식으로 TCP는 패킷을 추적하고, 나누어 보내진 데이터를 받아 조립할 수 있다.
cf) 흐름제어 혼잡제어
흐름제어는 데이터를 송신하는 곳과 수신하는 곳의 데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지하는 것이다. 예를 들어 송신하는 곳에서 감당이 안되게 데이터를 빠르게 많이 보내면 수신자에서 문제가 발생하기 때문이다.
혼잡제어는 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지하는 것이다. 만약 정보의 소통량이 과다하면 패킷을 조금만 전송하여 혼잡 붕괴 현상이 일어나는 것을 막는다.
cf) 3-Way Handshaking
TCP/IP 프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다. 실제로 데이터 전달이 시작하기 전에 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 알 수 있도록 하는 역할을 한다.
- Client -> Server : TCP SYN
- 클라이언트가 서버에 접속을 요청하는 SYN 패킷을 보낸다. 클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
- Server -> Client : TCP SYN ACK
- 서버는 SYN요청을 받고 클라이언트에게 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 발송하고 클라이언트가 다시 ACK으로 응답하기를 기다린다. 서버는 SYN_RECEIVED 상태가 된다.
- Client -> Server : TCP ACK
- 클라이언트는 서버에게 ACK를 보내고 이후부터는 연결이 이루어지고 데이터가 오가게 된다. 이때 서버 상태는 ESTABLISHED가 된다.
cf) 4-Way Handshaking
3-Way Handshaking은 TCP의 연결을 초기화 할 때 사용한다면, 4-Way Handshaking은 세션을 종료하기 위해 수행하는 절차이다.
- 클라이언트가 연결을 종료하겠다는 FIN 플래그를 전송한다.
- 서버는 일단 확인 메세지를 보내고 자신의 통신이 끝날때까지 기다리는 TIME_WAIT 상태가 된다.
- 서버가 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 FIN 플래그를 전송한다.
- 클라이언트는 확인했다는 메시지를 보낸다.
[참고 링크]
7. 서블릿
서블릿은 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술을 의미한다.
간단하게 말하자면, 자바를 사용하여 웹을 만들기 위해 필요한 기술이고, 클라이언트가 어떤 요청을 하면 그 결과를 전송해주는 역할을 한다고 보면 된다.
예를 들자면, 사용자가 아이디와 패스워드를 입력하여 로그인 버튼을 눌렀다면 서버는 그것을 확인하고 다음 페이지를 띄워줘야 하는데 이런 역할을 수행한다.
8. 애플리케이션 컨텍스트
스프링에서 말하는 “애플리케이션 컨텍스트”는 스프링이 관리하는 빈들이 담겨 있는 컨테이너라고 보면 된다. 스프링 안에는 여러 종류의 애플리케이션 컨텍스트 구현체가 있는데, ApplicationContext라는 인터페이스를 구현한 객체들이 다 애플리케이션 컨텍스트이다. 웹 애플리케이션 컨텍스트는 ApplicationContext를 확장한 WebApplicationContext 인터페이스의 구현체를 말한다. WebApplicationContext는 ApplicationContext에 getServletContext() 메서드가 추가된 인터페이스이다. 이 메서드를 호출하면 서블릿 컨텍스트를 반환되므로 결국 웹 애플리케이션 컨텍스트는 스프링 애플리케이션 컨텍스트의 변종이면서 서블릿 컨텍스트와 연관 관계에 있다는 정도로 정리할 수 있다. 이 메서드가 추가됨과 동시에 서블릿 컨텍스트를 이용한 몇가지 빈 생애 주기 스코프(애플리케이션, 리퀘스트, 세션 등)가 추가되기도 한다.
9. 객체지향프로그래밍과 절차지향프로그래밍
절차지향프로그래밍
- 프로그래밍의 실행 절차에 중점을 둔 프로그래밍의 일종으로 프로그램이 순차적으로 동작하는 것에 큰 의미를 둔 프로그래밍 방식
- 객체지향 프로그래밍과 비교하여 속도가 빠른 장점
- 유지보수가 어렵고 순서가 바뀌면 동일한 실행결과를 보장할 수 없으며 디버깅이 어려운 단점
객체지향개발(Object Oriented Programming) OOP
- 객체의 관점에서 프로그래밍을 하는 방식
- 실제 세계를 모뎅링하여 소프트웨어를 개발하는 방식으로 데이터와 절차를 하나의 덩어리로 묶어서 생각하게 된다.
- 컴퓨터 부품을 하나씩 사다가 컴퓨터를 조립하는 것과 같은 방식
- OOP는 객체를 기준으로 코드를 나누어 구현하는데 자바의 경우 그 구성 부분 단위가 클래스 이다.
장점
- 캡슐화 (encapsulation) : 하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메서드를 하나로 묶는 것을 의미 -> 겹합도를 낮추고 응집도를 높일 수 있음
- 객체 내의 멤버변수에 직접적인 접근을 제한하는 것
- rivate으로 선언하고 getter, setter을 통해 접근하는 것을 의미 -> 정보의 은닉
- 추상화 (abstraction) : 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념으로 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법
- 유연한 설계와 복잡도 관리
- 상속 (inheritance) : 기존 상위 클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념
- 확장성과 코드의 재사용성
- 다형성 (polymorphism) : 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해주는 기능으로 형태가 같은데 다른 기능을 하는 것을 의미
- 코드의 재사용성, 유지보수 용이
10. AOP
AOP(Aspect-Oriented Programming) 은 OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법이다. 간단하게 말하면, 여러 곳에서 쓰이는 공통 기능들을 모듈화하고, 필요한 곳에 연결함으로 유지 보수 혹은 재사용에 용이하도록 프로그래밍 하는 것이다.
프로그래밍을 하다보면 공통적인 기능이 많이 발생하여 공통 기능을 모든 모듈에 적용하기 위한 방법으로 자바에서는 보통 상속을 사용한다. 하지만 자바에서는 다중상속이 불가능하기 때문에 한계점이 있기에 AOP가 등장했다. AOP는 공통 기능과 핵심 기능을 분리해주는 역할을 한다고 보면 된다.
주요 개념
- Aspect : 여러 곳에 쓰이는 코드(공통 부분)를 모듈화 한 것 -> 공통 기능
- Target : Aspect가 적용되는 대상 -> 적용되는 클래스를 의미
- Advice : Aspect에서 실질적으로 어떤 일을 해야할지에 대한 실질적 부가기능을 담은 구현체
- JoinPoint : Advice가 적용될 위치 -> 즉 끼어들 지점을 의미 ex) 메서드 진입 지점, 생성자 호출 시점
- PointCut : JointPouint의 상세한 스펙을 정의한 것 ex) A란 메서드의 진입 시점에 호출할 것과 같이 구체적으로 Advice가 실행될 지점을 정의
AOP 방식
클래스 A에 test라는 메서드가 있고, Hello라는 Aspect가 있을 때, test메서드를 실행하기 전에 Hello를 출력해야 한다고 가정해보자.
- 컴파일 타임 : 자바 파일을 클래스 파일로 만들 때, 바이트 코드들을 조작하여 조작된 바이트 코드들을 생성하는 방식
- A.java 파일이 A.class로 변환될 때, A.class 파일에 Hello를 출력하는 메서드가 포함되어 있게 한다.
- 로드 타임 : A.java는 순수하게 A.class로 컴파일 되고, A.class를 로딩하는 시점에 Hello를 출력하는 메서드를 끼워넣는 방식
- A의 바이트코드는 변함 없이 로딩하는 JVM 메모리 상에서 test 메서드 전에 Hello를 출력하는 메서드가 같이 포함된 상태로 로딩되는 것이다.
- 런타임 : 프록시를 사용하는 방식으로 스프링 AOP가 사용하는 방식으로 접근 제어 및 부가기능을 추가하기 위해서 사용
- 스프링 빈에만 AOP를 적용 가능
- 중복 코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가에 대한 해결책을 지원하는 것이 목적
- A라는 Bean을 만들 때 A라는 타입의 프록시 Bean을 만든다. 이 프록시 Bean은 실제 A의 test 메서드를 호출하기 전에 우선적으로 Hello를 출력하는 것을 호출한 뒤에 test 메서드를 호출한다.
11. 클래스, 객체, 인스턴스
- 클래스 : 객체를 정의해놓은 것 또는 객체릐 설계도로 객체를 생성하는데 사용
- 객체 : 클래스에 정의된 내용대로 메모리에 생성된 것
- 인스턴스 : 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스를 의미
- 객체는 모든 인스턴스를 대표하는 포괄적인 의미이고, 인스턴스는 특정 클래스로부터 만들어진 객체를 의미