전체 글 156

[네트워크] TCP 4-Way Handshake

4-Way Handshake 모든 통신이 끝났다면, 다음과 같이 연결을 해제해야 한다. 클라이언트는 서버에게 연결을 종료한다는 FIN 플래그를 보낸다. 서버는 FIN을 받고, 확인했다는 ACK를 클라이언트에게 보낸다. (이때 모든 데이터를 보내기 위해 CLOSE_WAIT 상태가 된다.) 데이터를 모두 보냈다면, 연결이 종료되었다는 FIN 플래그를 클라이언트에게 보낸다. 클라이언트는 FIN을 받고, 확인했다는 ACK를 서버에게 보낸다. (아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT을 통해 기다린다.) Reference [TCP] 3 way handshake & 4 way handshake

네트워크 2022.05.07

[네트워크] TCP 3-Way Handshake

3-Way Handshake TCP는 정확한 전송을 보장해야 한다. 따라서 통신하기에 앞서, 논리적인 접속을 성립시키기 위해 다음과 같은 3-Way Handshake 과정을 진행한다. 클라이언트가 서버에게 SYN 패킷을 보냄 (sequence = x) 서버가 SYN(x)을 받고, 클라이언트로 받았다는 신호인 ACK와 SYN 패킷을 보냄 (sequence = y, ACK = x + 1) 클라이언트는 서버의 응답으로 ACK(x+1)와 SYN(y) 패킷을 받고, ACK(y+1)를 서버로 보냄 Reference [TCP] 3 way handshake & 4 way handshake

네트워크 2022.05.06

[웹개발] 쿠키와 세션

쿠키(Cookie) 쿠키란 하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떤 웹 사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 말한다. 이 기록 파일에 담긴 정보는 인터넷 사용자가 같은 웹 사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀐다. 세션(Session) 세션은 네트워크 분야에서 반영구적이고 상호작용적인 정보 교환을 전제하는 둘 이상의 통신 장치나 컴퓨터와 사용자 간의 대화나 송수신 연결 상태를 의미하는 보안적인 다이얼로그 및 시간대를 가리킨다. 따라서 세션은 연결 상태를 유지하는 것보다 연결 상태의 안정성을 더 중요시하게 된다. 쿠키와 세션의 차이점 쿠키와 세션은 다음과 같은 차이점이 있다. 저장 ..

웹개발 2022.05.05

[객체지향] 디자인 패턴(5) - 전략 패턴

전략 패턴 전략 패턴은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다. 전략 패턴은 특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화하며 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다. 다음 예시를 보자. [ 슈팅 게임을 설계하시오 ] 유닛 종류 : 전투기, 헬리콥터 유닛들은 미사일을 발사할 수 있다. 전투기는 직선 미사일을, 헬리콥터는 유도 미사일을 발사한다. 필살기로는 폭탄이 있는데, 전투기에는 있고 헬리콥터에는 없다. 전략 패턴을 적용한 설계는 다음과 같다. 먼저 미사일을 쏘는 것과 폭탄을 사용하는 것을 캡슐화한다. ShootAction과 BombAction으로 인터페이스를 선언하고, 각자 필요한 로직을 클래스로 만들어 구현한다. 그리고 전투기와 ..

객체지향 2022.05.04

[객체지향] 디자인 패턴(4) - 어댑터 패턴

어댑터 패턴 어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 동작하도록 해준다. 호환되지 않은 인터페이스를 사용하는 클라이언트 그대로 활용이 가능하고 향후 인터페이스가 변경되더라도 변경 내역은 어댑터에 캡슐화되므로 클라이언트는 바뀔 필요가 없다. 다음 코드를 보자. public interface Duck { public void quack(); public void fly(); } public interface Turkey { public void gobble(); public void fly(); } public class WildTurkey implements Turkey { @Overri..

객체지향 2022.05.03

[객체지향] 디자인 패턴(3) - 팩토리 메서드 패턴

팩토리 메서드 패턴 팩토리 메서드 패턴은 부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며, 자식 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 부모 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다. 다음 예시를 보자. Robot 클래스를 RobotFactory 클래스에서 생성하도록 되어 있다. createRobot 메서드에 넘어오는 name 파라미터에 따라 생성되는 Robot 클래스가 달라지는 것이다. Robot (추상 클래스) - SuperRobot - PowerRobot RobotFactory (추상 클래스) - SuperRobotFactory - ModifiedSuperRobotFactory public abstract class RobotFacto..

객체지향 2022.05.02

[객체지향] 디자인 패턴(2) - 템플릿 메서드 패턴

템플릿 메서드 패턴 템플릿 메서드 패턴은 로직을 단계 별로 나눠야 하는 상황에서 사용된다. 단계 별로 나눈 로직들이 앞으로 수정될 가능성이 있는 경우 더 효율적인 패턴이다. 템플릿 메서드 패턴을 적용시키는 데에는 다음과 같은 조건들이 있다. 클래스는 추상 클래스로 만든다. 단계를 진행하는 메서드는 수정이 불가능하도록 final 키워드를 추가한다. 각 단계들은 자식 클래스만 활용할 수 있도록 protected로 선언한다. 예를 들어 피자를 만들 때는 크게 반죽 -> 토핑 -> 굽기로 이루어져 있다. 이 단계는 항상 유지되며, 일반적으로 순서가 바뀔 일은 없다. 그러면 피자 종류에 따라 토핑만 바꾸면 된다. abstract class Pizza { protected void 반죽() { System.out...

객체지향 2022.05.01

[객체지향] 디자인 패턴(1) - 싱글톤 패턴

싱글톤 패턴 싱글톤 패턴이란 어플리케이션이 시작될 때, 최초 한 번만 메모리를 할당하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴이다. 즉, 인스턴스를 1개만 생성하여 인스턴스가 필요할 때 기존의 인스턴스를 활용하는 것이다. 싱글톤 패턴은 주로 공통된 객체를 여러 개 생성해서 사용해야 하는 상황에 사용된다. 예를 들어 커넥션 풀이나 스레드 풀, 캐시, 로그 기록 객체 등 인스턴스가 1개만 존재하는 것을 보증하고 싶을 때 사용한다. 싱글톤 패턴 장점 싱글톤 패턴은 다음과 같은 장점이 있다. 객체를 한 번만 생성하므로 메모리 낭비를 방지할 수 있다. 생성된 인스턴스는 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능하다. 싱글톤 패턴 단점 싱글톤 패턴은 다음과 같은 단점이 있다. 다른 클래스들 간의..

객체지향 2022.04.30

[객체지향] 디자인 패턴

디자인 패턴이란? 소프트웨어 개발 방법에서 사용되는 디자인 패턴은 프로그램 개발에서 자주 나타나는 문제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재사용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다. 디자인 패턴의 목적 소프트웨어의 재사용성을 높이고, 호환성과 유지 보수성을 보장하기 위해 사용한다. 디자인 패턴의 특징 디자인 패턴은 아이디어일 뿐, 특정한 구현이 아니다. 프로젝트에 항상 적용해야 하는 것은 아니지만 추후에 발생하는 문제를 해결하고 예방하기 위해 패턴을 만들어 둔 것이다. 디자인 패턴의 분류 디자인 패턴은 다음과 같은 3가지로 분류가 가능하다. 생성 패턴 생성 패턴은 객체의 생성 방식을 결정하는 패턴이다. ..

객체지향 2022.04.29

[Spring] 스프링 데이터베이스(5) - 트랜잭션 전파와 격리 레벨

트랜잭션 전파와 격리 레벨 현재 진행 중인 트랜잭션이 있는 상태에서 새로운 트랜잭션을 시작하고 싶다면 다음과 같이 새로운 커넥션을 가져와 트랜잭션을 시작할 수 있다. Connection conn = getConnection(); conn.setAutoCommit(false); // 중간 생략 ... Connection connNew = getConnection(); connNew.setAutoCommit(false); // 새로운 커넥션으로 트랜잭션 시작 // 중간 생략 ... connNew.commit(); // 새로운 트랜잭션 종료 connNew.close(); // 중간 생략 ... conn.commit(); conn.close(); 스프링은 새로운 트랜잭션을 새로 생성하는 것뿐만 아니라 기존 트랜..

Spring 2022.04.28