ETC/1. Today I Learned

개발 주요 개념 정리 - 클래스, 인터페이스, JSON,

montmer27 2025. 12. 24. 20:51
  • 클래스는 객체를 생성하는 틀이며, 객체 없이는 프로그램이 동작할 수 없다.
    • 메서드도 오버로딩이 가능하다
  • 인터페이스는 구현체에 관계없이 동일한 기능을 제공한다. 하나의 인터페이스로 동일한 기능을 공유하는 여러 구현체를 만들 수 있다. 이를 다형성이라 한다. 
  • 다형성의 특징을 잘 보여주는 것이, 객체의 클래스가 대신 인터페이스명을 사용하여 객체를 생성하는 경우이다.
public interface Mouse {
    rightClick();
    leftClick();
    scroll();
}

public class LogitechMouse implements Mouse {
    @Override
    rightClick(){ ... }
    @Override
    leftClick(){ ... }
    @Override
    scroll(){ ... }
 }
 public class SamsungMouse implements Mouse {
    @Override
    rightClick(){ ... }
    @Override
    leftClick(){ ... }
    @Override
    scroll(){ ... }
 }
 public class AppleMouse implements Mouse {
    @Override
    rightClick(){ ... }
    @Override
    leftClick(){ ... }
    @Override
    scroll(){ ... }
 }
 
 //다형성의 특징 : 클래스 이름 대신 인터페이스 이름으로 객체 생성 가능
 Mouse mouse1 = new LogitechMouse();
 Mouse mouse2 = new SamsungMouse();
 Mouse mouse3 = new AppleMouse();

 

  • 라이브러리는 관련 있는 클래스와 함수의 모음이고, 프레임워크는 상호 호환되는 라이브러리들의 모음이다.
  • 프레임워크는 소프트웨어 개발 환경을 의미한다. 이는 공통된 규칙을 강제하기 때문에 일관되고 안정적인 개발을 가능케 하며, 이를 통해 테스트와 협업이 용이해진다. 덕분에 개발자는 비즈니스 로직에만 집중할 수 있다.
    • 그러나 편리함을 위해선 반드시 자유를 타협해야 한다. 
  • HTTP에서 P는 Protocol, 즉 규약을 의미한다.
    • HTTP는 1.1 버전을 가장 많이 사용한다
    • HTTP의 동작 방식은 클라이언트가 서버에 요청을 보내고, 응답을 받을 때까지 대기한다. 이를 동기라고 한다.
    • HTTP는 불특정 다수의 통신 환경을 기반으로 개발되었다.
    • 기본적으로 서버는 무상태성(Stateless)을 유지한다. 이는
      • 수평확장성(Scale Out)이 용이하고
      • 서버 증설이 쉽다(이전 서버의 데이터가 필요하지 않으므로
      • 단, 무상태를 유지하면 안 되는 경우에 취약하다.
  • HTTP Message는 크게 4부분(공백 제외 3부분)으로 나뉘어진다. 요청 메시지/응답 메시지인지 여부에 따라 각 부분에 들어가는 내용이 달라진다.
    • Start
      • 요청 메시지 : 의도가 포함됨(POST/GET/PUT/PATCH/DELETE 등 메서드들), 경로(Path)
      • 응답 메시지 : HTTP 버전, 상태 코드 및 메시지
    • Header
      • 요청 메시지 : Host, 요청 관련 추가 정보
      • 응답 메시지 : 나중에 배움
    • Empty Line
    • Body
      • 요청 메시지 (GET)의 경우 Body를 원칙적으로 사용할 순 있지만 사용하지 않는 경우가 많음. 경우에 따라 안 되는 경우도 있음
      • 응답 메시지 : 실제 응답 데이터
    • HTTP Methods
      • POST : 기본적으로는 생성이나, 다른 메서드로 분류하기 애매한 것들도 포함
      • PUT : 덮어쓰기
      • PATCH : 부분수정
      • DELETE : 삭제
      • HEAD : GET에서 본문을 제외하고 상태줄과 Header만 반환
      • OPTIONS : 현재 통신 가능한 메서드 요청
    • HTTP 상태 코드
      • 200번대: 성공 (단, 요청과 처리는 별개다)
        • 201 : 요청은 성공했으나 처리는 미완료
        • 204 : 응답 데이터가 없는 상황
      • 300번대 : 추가 행동이 필요 (예: OAUTH 구현 시)
      • 400번대 : 클라이언트의 잘못 - 스펙 불일치로 인한 수정 필요
        • 401 : 인증(로그인 필요)
        • 403 : 승인거부(관리자 권한 필요) - 인가 문제
        • 404 : 리소스 없음 (또는 없는 척하며 자원을 숨길 수 있음)
      • 500번대 : 서버의 잘못. 대부분의 경우 500을 사용
  •  API란 Application Programming Interface의 약자이며, Interface라는 점에서 다음과 같은 특징을 지닌다.
    • 서버의 구현 방식을 몰라도 API 명세서로만 요청-응답이 이루어진다.
    • REST(RESTFUL) API는  가독성 있는 API를 만들기 위한 일종의 컨벤션으로, 다음과 같은 특징을 선호한다.
      • 소문자
      • 언더바(_)보다 대시(-) 사용 우선
      • 마지막에 /(슬래시) 넣지 않기
      • 파일 확장자 포함하지 않기
      • 계층화하기
      • 동사보다 명사, 단수보다 복수 사용하기
  •  Annotation이란,
    • 메타데이터에 추가하여 코드에 특별한 의미를 부여하거나
    • 컴파일러와 런타임에 특정 동작을 트리거하기 위해 사용된다.
    • 대표적인 Annotation으로 lombok, Slf4j가 있다.
      • lombok의 주요 기능은 보일러플레이트코드(Getter, Setter등 클래스마다 반복적으로 작성되는 코드들을 의미한다)를 자동으로 생성하여 코드의 가독성을 높여준다. 예를 들어 @Getter, @Setter, @ToString, @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor 등이 있다. 
      • Slf4j는 logger 객체를 자동으로 생성해 준다. 
  • Spring Initializr : 스프링 부트 기반의 프로젝트를 쉽게 생성하도록 도와주는 도구이나, IntelliJ Ultimate Edition에서는 불필요하다. 
  • 의존성 : 프로젝트 동작에 필수적인 외부 코드 및 라이브러리를 의미한다.
    • 과거에는 Maven을 사용했지만, 이는 프로젝트가 커질수록 크기가 기하급수적으로 커진다는 단점이 있었기 때문에 요즘엔 gradle을 쓴다. Gradle은 Groovy 또는 Kotlin 언어로 작성된 build.gradle 파일을 사용한다.
    • 의존성 추가 : Maven Repository에서 의존성을 검색하여 추가할 수 있다. Gradle을 사용함에도 Maven Repository가 Gradle보다 먼저 나왔기 때문에 의존성은 Maven Repository에서 다운받아 사용한다. 단, 해당 의존성을 build.gradle 파일에 추가한 뒤 우측 상단 코끼리 아이콘을 눌러야 적용된다.
  • 정적 HTTP와 동적 HTTP
    • 초기 HTTP는 요청이 들어오면 정해진 응답을 모두에게 보여주는 방식이었다. 이를 정적 HTTP라 한다
    • 하지만 요청마다 다른 응답을 생성해서 응답해줄 수 있는 동적 HTTP에 대한 요구가 늘어났고, 이에 서버에서 프로그램을 실행하는 Servlet이 탄생하게 되었다.
    • Servlet의 실행, 관리, 웹서버와의 통신을 원활하게 해주는 환경이 필요하게 되었는데, 이를 Servlet Container라고 한다. 대표적인 것이 톰캣이다.
    • Servlet은 스프링부트 표준이 아니기 때문에, 스프링부트에 탐지되기 위해선 특별한 Annotation이 필요하다. 프로젝트 메인에 @ServletComponentScan을 추가해 준다.
  • Spring Boot Application 실행 시 화면

기본적으로 Spring Application 실행 시 port는 8080이다.
WebServlet의 이름을 "/hello"로 지정
요청 Header에 /hello 명시

참고로, Spring Boot Application을 실행하지 않으면 돌아가지 않는다.