Java/Spring

[Spring] 2. 기초 지식 배우기

Sigfriede 2023. 5. 26. 11:18

  어떤 기능을 구현하고자 할 때, 기능을 구현하는 것은 중요하지만 한 기능에 초점을 맞춰 코드를 작성하는 것은 바람직하지 않습니다. 기능을 추가하거나 변경하는 경우 수정이 어려울 수 있기 때문입니다. 대신 클래스가 인터페이스를 의존하게 해서 프로그램 전체에서의 수정이 아닌, 인터페이스에서 부분만을 수정하는 것만으로도 원하는 결과를 얻을 수 있습니다. 독립적인 프로그래밍이 가능한 것입니다.

  인터페이스는 상수와 메서드 타입만 정의한 것입니다. 일종의 추상 클래스인 셈입니다. 인터페이스는 다른 클래스에서 구현하는 것을 전제로 만들어집니다. 클래스는 상속받을 때 extends를 쓰지만, 인터페이스는 implements를 씁니다. 자바에서는 원칙적으로 다중 상속을 허용하지 않지만, 인터페이스를 이용하여 다중 상속을 구현할 수도 있습니다.

  자바에는 다양한 자료구조가 있습니다. 그 중 하나가 리스트(List)입니다. 종류에는 배열(Array), 배열 리스트(ArrayList), 연결 리스트(LinkedList)가 있습니다. 여기서 리스트는 인터페이스의 한 종류입니다. 컬렉션 프레임워크에서 제공합니다. 컬렉션 프레임워크에는 리스트 외에도 셋(Set), 맵(Map) 등 다양한 인터페이스와 구현 클래스로 구성되어 있습니다.

 

  서버(server)와 클라이언트(client)는 정보를 주고 받는 관계입니다. 클라이언트가 서비스를 요청(request)하면 서버는 이에 응답(response)하여 클라이언트가 원하는 서비스를 제공합니다.

  브라우저 역시 웹 서버와 클라이언트의 상호작용로 이루어지는 소프트웨어이며, 인터넷 컨텐츠를 검색 및 열람을 하기 위한 응용 프로그램입니다. 초기에는 웹 서핑 정도의 기능을 했지만, 웹 기술이 발달하면서 웹 브라우저의 기능이 점차 확대되고 있습니다. 대표적인 브라우저로는 구글 크롬(Google Chrome), 파이어폭스(Firefox), 사파리(Safari) 등이 있습니다. 한국에는 네이버에서 크로미움(chromium) 기반으로 제작한 웨일(whale)이 있습니다.

  애플리케이션은 응용 프로그램 소프트웨어의 약어입니다. 웹 애플리케이션은 인터넷을 통해 사용되는 응용 프로그램을 의미합니다.

  웹 서버는 웹 애플리케이션을 배포하는 서버입니다. 웹 서버는 항상 실행되며 클라이언트로부터 요청을 계속 기다립니다. 클라이언트와 웹 서버는 HTTP 요청과 HTTP 응답으로 상호작용하고 이를 HTTP 통신이라고 합니다. HTTP 통신은 다음과 같은 과정으로 이루어집니다. (책에는 본문과 함께 그림으로 설명되어 있습니다.)

 

1. 클라이언트가 브라우저에 URL을 입력합니다.
2. 클라이언트에서 웹 서버로 HTTP 요청이 전송됩니다.
3. 웹 서버는 HTTP 요청을 받아 HTTP 요청에 해당하는 HTTP 응답을 클라이언트에게 반환합니다.
4. 브라우저는 받은 응답을 표시하고 클라이언트가 이를 확인합니다.

 

  HTTP 요청에는 다양한 유형이 있습니다. GET 메서드와 POST 메서드 역시 HTTP 요청의 한 유형입니다. GET 메서드는 브라우저에서 웹 서버로 값을 전달할 때 URL 뒤에 값을 더하여 보내는 방식입니다. URL 뒤에 오는 정보를 쿼리 스트링(query string) 또는 쿼리 문자열이라고 부릅니다. 쿼리 스트링의 특징은 다음과 같습니다.

  • URL 끝에 '?'가 붙어 쿼리 스트링의 시작을 나타냅니다. (domain.com/?)
  • 형식은 '이름 = 값'입니다. (domain,com/?name=value)
  • 여러 값을 전달하려면 '&'로 연결합니다. (domain.com/?name=value&tel=010)

 

  POST 메서드는 브라우저로부터 웹 서버에 값을 보낼 때 요청 본문(request body)이라고 하는 URL에는 보이지 않는 장소에 값을 넣어서 보내는 방법입니다. 예를 들어, 아이디와 비밀번호 등 민감한 정보를 입력해야 하는 페이지에서 GET 메서드로 값을 보낸다면 URL에 아이디와 비밀번호가 노출될 것입니다. 따라서 이러한 상황에서는 body에 데이터를 담는 POST 메서드가 적합합니다. 또한 POST 메서드는 쿼리 스트링을 이용하는 GET 메서드와 구분되어,  많은 양의 값을 보내는 데 적합합니다.

  그러나 GET 메서드에 단점만 있는 것은 아닙니다. GET 메서드는 URL에 연결해 데이터를 송신하기 때문에 '즐겨찾기'에 등록하는 URL 자체에 쿼리 스트링으로 검색 데이터를 포함할 수 있지만, POST 메서드는 검색 데이터를 요청 본문에 저장하기 때문에 즐겨찾기에 등록할 수 없습니다. POST 메소드로 요청을 보내기 위해서는 별도의 과정이 필요합니다.

  두 메서드는 설계 원칙에 따라 사용이 나뉘기도 합니다. GET 메서드는 주로 조회 시에, POST 메서드는 생성 또는 갱신 시에 사용합니다. 표준을 지키지 않는다면 혼선을 빚을 수도 있을 것입니다.

 

  개발을 편리하게 하기 위해서 라이브러리 또는 빌드 도구를 이용하는 경우가 많습니다. 라이브러리란, 편리한 프로그램을 모아 모듈화한 것을 이르는 말입니다. 주요 라이브러리로는 lombok이 있습니다.

  lombok은 setter와 getter를 자동으로 생성하는 기능입니다. 인텔리제이와 이클립스 등 IDE에서도 setter와 getter를 작성해주는 기능이 있습니다. 그러나 필드를 추가하거나 변경 혹은 삭제 시에 수정해야 한다는 단점이 있습니다. lombok은 그러한 과정을 필요로 하지 않는다는 장점이 있습니다. 또한 앞서 설명했듯, lombok이 자동으로 setter와 getter 코드를 구현해주므로 전체적인 코드가 간결해집니다.

  이외에도 json 파일의 파싱을 도와주는 json-simple, 로그를 관리하고 기록하는 Log4j, 테스트 케이스를 작성하고 실행하는 JUnit 등이 있습니다. 이외에도 수많은 라이브러리가 있으므로 본인에게 필요한 라이브러리를 찾아 효율적인 개발을 한다면 좋을 것 같습니다.

  빌드 도구로는 Gradle이 있습니다. 유사한 빌드 도구로는 Maven 등이 있습니다. 이 빌드 도구들은 빌드 파일에 설정을 작성하는 것으로 여러 가지 작업을(플러그인, 라이브러리 관리 등) 자동으로 해주므로 상당히 편리하다는 장점이 있습니다.

 

  ※ "스프링 프레임워크 첫걸음"이라는 책을 참고하여 쓴 게시글로, 책의 내용을 완전히 담지 않되 공부한 부분을 위주로 정리하여 작성하고자 했습니다. 따라서 글에는 책에서 다루지 않은 내용도 포함되어 있으며 문제가 되거나 부정확한 부분이 있다면 알려주시면 감사하겠습니다.