본문 바로가기
Back-end

2023.08.08 TIL

by 신재권 2023. 8. 9.

Java

String 클래스

String 클래스는 final로 선언되어 있기 때문에 상속이 불가능하다.

Object 를 상속받고 있고, Serializable, Comparable<String>, CharSequence를 구현한다.

Serializable 인터페이스는 구현해야 하는 메서드가 하나도 없는 인터페이스이다. 이 인터페이스를 구현하면, 해당 객체를 파일로 작성하거나 다른 서버에 전송 가능한 상태가 된다.

Comparable 인터페이스는 compareTo() 라는 메서드가 있다. 이 메서드는 매개 변수로 넘어가는 객체와 현재 객체가 같은지를 비교하는데 사용한다. 이 메서드의 리턴 타입은 int이다. 즉 객체의 순서를 처리할 때 용이하게 사요된다.

CharSequence 인터페이스는 해당 클래스가 문자열을 다루기 위한 클래스라는 것을 명시적으로 나타내는데 사용된다.

String의 생성자

  • String() : 비어있는 String 객체 생성, null 로 선언하는 것이 더 효율적이다.
  • String(byte[] bytes) : 현재 사용중인 플랫폼의 캐릭터 셋을 사용하여 제공된 byte 배열을 디코딩한 String 객체를 생성
  • String(byte[] bytes, Charset charset) : 지정된 캐릭터 셋을 사용하여 지정한 byte 배열을 디코딩
  • String(byte[] bytes, int offset, int length) : 현재 사용중인 플랫폼의 캐릭터 셋을 사용하여 배열 일부를 디코딩
  • String(byte[] bytes, int offset, int length, Charset charset) : 지정된 캐릭터 셋을 사용하여 byte 배열의 일부를 디코딩한 String 객체를 생성
  • String(byte[] bytes, int offset, int length, String charsetName) : 지정한 이름을 갖는 캐릭터 셋을 사용하여 byte 배열의 일부를 디코딩
  • String(char[] value) : char 배열의 내용들을 붙여 String 객체 생성
  • String(char[] value, int offset, int count) : char 배열의 일부 내용들을 붙여 String 객체를 생성
  • String(int[] codePoints, int offset, int count) : 유니코드 코드 위치로 구성되어 있는 배열의 일부를 새로운 String 객체를 생성
  • String(String original) : 매개변수로 넘어온 String과 동일한 값을 갖는 String 객체 생성, 다시 말해 복제본 생성
  • String(StringBuffer buffer) : 매개변수로 넘어온 StringBuffer 클래스의 문자열의 값과 동일한 String 객체 생성
  • String(StringBuilder builder) : 매개변수로 넘어온 StringBuilder 클래스에 정의되어 있는 문자열의 값과 동일한 String 객체 생성

String → byte

String에는 문자열의 값을 byte 배열로 변환하는 getBytes() 메서드가 있다.

  • byte[] getBytes()
  • byte[] getBytes(Charset charset)
  • byte[] getBytes(String charsetName)

잘못된 캐릭터 셋을 지정하면 의도하지 않은 문자가 나온다.

객체 널 체크

객체가 널인지 아닌지는 실행시에만 확인할 수 있기 때문에, null 체크를 해야된다.

String 내용을 비교하고 검색

  • int length() : 문자열의 길이를 리턴
  • boolean isEmpty() : 문자열이 비어있는지 확인 (문자열의 길이가 0)
  • boolean equals(Object anObject) : 같은지 확인
  • boolean equalsIgnoreCase(String anotherStr) : 대소문자 구분 x
  • int compareTo(String anotherStr) : 순서 비교 (사전순), 매개변수로 넘어온 String 객체가 앞에있으면 양수, 뒤에 있으면 음수 리턴
  • int compareToIgnoreCase(String str) : 대소문자 구분 x
  • boolean contentEquals(CharSequence cs)
  • boolean contentEquals(StringBuffer sb)

String을 리터럴로 초기화하면 Constant Pool에 저장된다. 즉 같은 문자열이면 재사용이 된다. 즉 == 연산을 해도 같은 문자열이면 true 가 반환된다.

특정 조건에 맞는 문자열이 있는지를 확인

  • booelan startsWith(String prefix) : 특정 문자열로 시작하는지 확인
  • boolean startsWith(String prefix, int toffset)
  • boolean endsWith(String suffix)
  • boolean contains(CharSequence s) : 특정 문자열을 포함하는지 확인
  • boolean matches(String regex) : 정규 표현식
  • boolean regionMatchers(boolean ignoreCase, int toffset, String toher, int ooffset, int len)
  • booelan regionMatchers(int toffset, String other, int ooffset, int len) : 문자열 중 특정 영역이 매개변수로 넘어온 문자열과 동일한지 확인
    • ignoreCase : true 일 경우 대소문자 구분 x
    • toffset : 비교 대상 문자열의 확인 시작 위치 지정
    • other : 존재하는지를 확인할 문자열을 의미
    • ooffset : other 객체의 확인 시작 위치 지정
    • len : 비교할 char의 개수를 지정

String 에서 위치를 찾아내기

  • int indexOf(int ch)
  • int indexOf(int ch, int fromIndex)
  • int indexOf(String str)
  • int indexOf(String str, int fromIndex)
  • int lastIndexOf(int ch)
  • int lastIndexOf(int ch, int fromIndex)
  • int lastIndexOf(String str)
  • int lastIndexOf(String str, int fromIndex)

indexOf() : 앞에서 부터 문자열이나 char 를 찾는다.

lastIndexOf() : 뒤에서부터 찾는다.

char 단위 값 추출

  • char charAt(int index) : 특정 위치의 char 리턴
  • void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegion) : 매개변수로 넘어온 dst 라는 char 배열 내에 srcBegin 에서 srcEnd 에 있는 char를 저장한다. dst 배열의 시작 위치는 dstBegin 이다.
  • int codePointAt(int index) : 특정 유니코드 값을 리턴, char 형변환시 char 출력 가능
  • int codePointBefore(int index) :특정 위치 앞에 있는 char의 유니코드 값을 리턴, 리턴 타입은 int 지만, 이 값을 char로 형변환한다면 char 값을 출력할 수 있다.
  • int codePointCount(int beginIndex, int endIndex) : 지정한 범위에 있는 유니코드 개수를 리턴
  • int offsetByCodePoints(int index, int codePointOffset) : 지정한 index 부터 오프셋이 설정된 인덱스를 리턴한다.

char[] → String

  • static String copyValueOf(char[] data) : char 배열에 있는 값을 문자열로 변환
  • static String copyValueOf(char[] data, int offset, int count) : char 배열에 있는 값을 문자열로 변환, 단 off-set 위치부터 count까지의 개수만큼만 문자열로 변환

String → char[]

  • char[] toCharArray() : 문자열을 char 배열로 변환하는 메서드

문자열의 일부 값을 잘라내는 메서드

  • String subString(int begin index)
  • String subString(int beginIndex, int endIndex)
  • CharSequence subSequence(int beginIndex, int endIndex)

String[] 으로 나누는 메서드

  • String[] split(String regex)
  • String[] split(String regex, int limit)

문자열을 합치는 메서드, 공백 없애는 메서드

  • String concat(String str) : 기존 문자열 + 매개변수 str을 리턴
  • String trim() : 공백 제거

내용 교체 메서드

  • String replace(char oldChar, char newChar)
  • String replace(CharSequence target, CharSequence replacement)
  • String replaceAll(String regex, String replacement)
  • String replaceFirst(String regex, String replacement)

특정 형식에 맞춰 값을 치환

  • static String format(String format, Object… args) : format에 있는 문자열의 내용 중 변환해야 하는 부분을 args의 내용으로  변환
  • static String(format(Local l, Strinf format, Object args) : Local 타입의 l에 선언된 지역에 맞추어 출력
    • %d : 정수
    • %f : 소수
    • %s : 문자

대소문자 변환

  • String toLowerCase()
  • String toLowerCase(Locale locale)
  • String toUpperCase()
  • String toUpperCase(Locale locale)

기본 자료형 → 문자열

  • static String valueOf(type x)
    • boolean
    • char
    • char[]
    • char[], int offset, int count
    • double
    • float
    • int
    • long
    • Object : toString()의 결과

불변 String의 단점 보완

String은 불변한 객체이다.

즉, 한번 만들어지면 더 이상 값을 바꿀수 없다.

StringBuilder는 Thread safe 하지 않고, StringBuffer는 Thread safe 하다.

속도는 StringBuilder가 훨씬 빠르다. Buffer는 동기화 과정이 있기 때문


Network

HTML

웹 페이지를 만드는 HTML 파일의 HT는 HyperText의 머릿글자이다.

하이퍼텍스트는 복수의 문서를 연결해 서로 참조할 수 있는 문서이다.

ML은 Markup Language의 줄임말로, 문서의 구조를 명확히 표현하기 위한 언어라는 뜻이다.

마크업 언어를 이용해 문서의 제목, 헤드라인, 단락, 리스트 등 구조를 명확히 함으로써, 컴퓨터로 문장 구조 분석을 간편하게 할 수 있다.

HTML에서는 태그를 사용해 구조, 링크, 문자 크기 등을 지정 가능하다.

스타일 시트

HTML 태그로 웹 페이지의 외관을 지정할 수 있지만, 스타일 시트를 따로 정의해 복수의 웹페이지를 동시에 변경할 수도 있다.

스타일 시트는 CSS 언어로 사용한다.

CSS를 사용하면 웹페이지 디자인도 간단히 변경할 수 있다.

웹사이트의 주소

웹 사이트를 볼 때는 웹 사이트의 HTML 파일을 다운로드 해서 웹 브라우저로 표시한다.

웹 사이트를 보기 위해 웹 페이지 파일을 지정해야 하는데, 전송받고 싶은 웹 페이지를 지정하는 것이 웹 사이트의 주소이다.

URL

URL은 Uniform Resource Locator의 약자로 https://로 시작한다.

http는 스킴이라 하며, 프로토콜을 나타낸다.

: 뒤에는 파일이 있는 장소를 나타내고, //는 호스트명이다.

웹 서버에서 접속할 때는 호스트명에서 IP 주소로 변환하는 DNS의 이름해석이 필요하다.

호스트명 뒤에는 포트번호가 이어지지만, 대부분 생략한다. 생략한 경우 지정된 스킴에서 프로토콜의 웰노운 포트를 사용한다.

즉, URL은 전송받고 싶은 웹 서버와 그 파일을 나타낸다.

<스킴>://<호스트명>/<경로명>

HTML 파일 전송

웹 사이트를 구성하는 HTML 파일을 전송하기 위해 HTTP(Hyper Text Transfer Protocol)를 이용한다.

즉, 웹 브라우저와 웹 서버 애플리케이션은 HTTP를 이용해 웹페이지 파일을 전송한다.

HTTP는 HTML 뿐 아니라 다양한 종류의 파일을 전송할 수 있다.

HTTP 파일 전송은 HTTP 요청과 응답을 주고받으며 이루어진다.

트랜스포트층의 프로토콜로서 TCP를 이용하므로, HTTP 통신하기전 TCP 커넥션을 맺는다.

HTTP 요청

HTTP 요청을 통해 웹 브라우저에서 웹 서버 애플리케이션으로 파일 전송을 요청한다.

HTTP 요청은 리퀘스트 라인, 메시지 헤더, 엔티티 바디의 세 부분으로 나뉜다.

  • HTTP 요청
    • 리퀘스트 라인 : 웹 서버에 대한 실제 처리 요청 전달
      • 메서드 : 서버에 대한 요청(GET, POST, …)
      • URI
      • 버전(HTTP 버전)
    • 메시지 헤더 : 요청 라인에서 이어지는 여러줄의 텍스트
      • 웹 브라우저의 종류, 버전
      • 대응하는 데이터 형식
    • 엔티티 : POST 로 웹 브라우저에서 데이터를 보낼 때 사용

메시지 헤더와 엔티티 바디 사이에 공백 라인이 있다.

메서드 종류

  • GET : URI로 지정한 데이터를 가져온다.
  • HEAD : URI로 지정한 데이터의 헤더만 가져온다.
  • POST : 서버에 데이터를 보낸다.
  • PUT : 서버에 파일을 보낸다.
  • DELETE : 서버의 파일을 삭제하도록 요청한다.
  • CONNECT : 프록시 서버를 경유에 통신한다.

최종 캡슐화 결과

이더넷 헤더 IP 헤더 TCP 헤더 HTTP 헤더 웹 브라우저의 데이터 FCS

HTTP 응답

HTTP 요청에 대한 응답으로 HTTP 응답을 반환한다.

HTTP 요청과 비슷하게 리스폰스 라인, 메시지 헤더, 엔티티 바디로 구성된다.

  • HTTP 응답
    • 리스폰스 라인
      • 버전 : HTTP 버전
      • 상태 코드 : 웹 서버 애플리케이션의 처리 결과
      • 설명문 : 상태 코드의 의미를 간단히 보여주는 텍스트
    • 메시지 헤더 : 웹 서버 애플리케이션이 더 자세한 정보를 웹 브라우저에 전달하기 위해 이용
      • 데이터 형식
      • 갱신 날짜
    • 엔티티 바디 : 웹브라우저에 돌려보낼 데이터, 주로 HTML 파일

메시지 헤더와 엔티티 바디 사이에 공백 라인 존재

상태 코드

  • 1xx : 정보, 추가 정보가 있음을 전달
  • 2xx : 성공, 서버가 요청을 처리했음을 전달
  • 3xx : 리다이렉트, 다른 URI로 다시 리퀘스트하도록 요청
  • 4xx : 클라이언트 에러, 요청에 문제가 있어 처리 불가
  • 5xx : 서버 에러, 서버쪽에 문제가 있어 처리 불가

최종 캡슐화 결과

이더넷 헤더 IP 헤더 TCP 헤더 HTTP 헤더 웹 브라우저의 데이터 FCS

웹 페이지 내용 커스터마이징

상황에 따라 웹 페이지의 내용을 커스터마이징 하고 싶을 때 HTTP 쿠키를 사용한다.

HTTP 쿠키는 웹 서버 애플리케이션이 웹 브라우저에 특정 정보를 저장해두는 기술

웹 서버 애플리케이션은 웹 브라우저의 요청에 대한 HTTP 응답에 쿠키를 포함하여 보낸다.(헤더에 포함)

웹 브라우저가 쿠키를 받을 수 있으면, 수신한 쿠키를 저장하고, 같은 웹사이트에서 요청을 보낼시 쿠키도 함께 포함된다.

즉, 쿠키를 이용함으로써, 웹 서버는 사용자의 로그인 정보나 사이트 내 웹 페이지 열람 이력을 관리할 수 있고, 커스터마이징도 가능하다.

웹 접속을 대신하는 서버

웹 페이지를 열람할 때 웹 브라우저와 웹 서버 애플리케이션은 서로 통신한다. 이때 프록시 서버를 거치는 경우도 있다.

프록시 서버란 웹 사이트 접속을 대행하는 서버이다.

서버를 프록시 서버로 동작시키려면, 서버에서 프록시 서버 애플리케이션을 실행해야 하고, 웹 브라우저에서 프록시 서버 설정을 할 필요가 있다.

  1. 클라이언트 PC → URL 입력
  2. 프록시 서버로 HTTP 요청 보냄
  3. 프록시 서버에서 URL로 지정된 웹서버에 HTTP 요청을 보냄
  4. 웹 서버에서 프록시 서버로 HTTP 응답을 보냄
  5. 프록시 서버에서 클라이언트 PC로 HTTP 응답을 보냄

웹 서버에서 보면 접속하는 것은 프록시 서버이고, 원래 클라이언트는 알 수 없게 된다.

관리자 입장에서의 목적

주로 기업 네트워크에서 프록시 서버를 도입한다.

  1. 클라이언트 PC의 웹 브라우저에서 어떤 웹 사이트에 접속하는지 확인
  2. 부정한 웹 사이트 접속 제한 가능 → URL 필터링, 웹 필터링

웹 애플리케이션

웹 브라우저를 유저 인터페이스로 이용하는 애플리케이션을 웹 애플리케이션이라 한다.

웹 브라우저를 유저 인터페이스로 이용하므로, 클라이언트 PC 용 전용 애플리케이션을 개발해 설치하거나 업데이트 등이 필요 없어진다.

즉, 웹 브라우저만 있으면 처리가 가능하다.

처리 자체는 웹 서버가 아닌 애플리케이션 서버를 사용하기도 한다. 또한 데이터베이스 서버와 연계하는 경우도 있다.

애플리케이션

웹 사이트에 접속하기 위해 이용하는 애플리케이션은 웹 브라우저이다.

Chrome, Edge, Safari 등 다양한 웹 브라우저가 있다.

웹 접속의 대전제는 TCP/IP 설정이 바르게 되어 있는 것이다.

웹 브라우저는 특별한 설정은 필요 없지만, 프록시 서버를 이용할 때는 프록시 서버의 IP 주소와 포트 번호를 설정해야 한다.

웹 서버에는 웹 서버 애플리케이션이 필요한데 대표적으로 Apache가 있다.

웹 접속에 이용하는 프로토콜은 HTTP 이다. 또한 전송 계층은 TCP, 인터넷 계층은 IP를 이용한다. HTTP의 웰 노운 포트는 80이고, 네트워크 인터페이스층은 이더넷을 이용한다.

웹 사이트에 접속할 때는 웹 사이트 주소인 URL을 이용한다.

URL로부터 웹 서버의 IP를 구하는 이름 해석을 위해선 DNS 가 필요하다.

DNS와 ARP는 자동으로 수행된다.

즉 HTTP/TCP/IP 이 필요하고, DNS와 ARP가 필요하다.

웹 사이트 접속 흐름

웹 사이트를 볼때는 DNS 이름 해석과 ARP의 주소해석 기능도 동작한다. 또한 TCP로 커넥션도 맺는다.

  1. 웹 브라우저에 URL을 입력
  2. URL에 포함된 웹 서버의 호스트명을 DNS 서버에 질의해 웹 서버의 IP 주소를 해석
    1. 라우터가 DNS 서버 기능을 가진다. 라우터 자체에는 목적지가 되는 웹 서버 IP 주소가 없으므로, 라우터에서 다시 DNS로 질의
  3. DNS서버에 질의할 때 이더넷의 MAC 주소 구하기 위해 ARP도 실행
  4. 웹 서버의 IP 주소를 알아내, IP 주소를 지정하여 웹 브라우저와 웹 서버 애플리케이션 간에 TCP 커넥션 확립
  5. HTTP 요청 및 응답을 주고 받음

요청 및 응답의 크기가 크면 TCP에서 분할하고, 분할된 파일을 조립하여, 웹 브라우저에 내용을 표시하면 사용자는 웹 사이트를 볼 수 있다.

'Back-end' 카테고리의 다른 글

GC  (0) 2023.08.12
JVM  (0) 2023.08.11
2023.08.07 TIL  (0) 2023.08.07
2023.08.06 TIL  (0) 2023.08.07
2023.08.04 TIL  (0) 2023.08.04