서버의 정의, IP와 포트번호, API 그리고 Spring

구환준/모건·2023년 9월 20일

UMC-5th

목록 보기
1/10

Server란?

서버는 OS에 의해 동작하는 프로세스이며 클라이언트의 역할을 하는 프로세스와 소켓을 통해 IPC를 수행하는 것

IP와 포트번호

컴퓨터가 네트워크 상에서 통신을 하기 위해서는 수많은 정보의 바다에서 자신이 누구인지
유일하게 식별이 가능한 수단

  • IP주소
    인터넷에 연결된 모든 기기가 가지고 있는 고유한 식별 번호
    집이나 회사 건물의 주소와 같은 개념 (올림픽로 4길 42 X동XXX호),
  • 포트번호 한 컴퓨터(서버)에서 여러 가지 서비스를 동시에 운영할 수 있는데, 포트 번호를 통해 이러한 서비스를 구별
    IP 주소가 건물의 주소라면, 포트 번호는 그 건물 내의 '방 번호'나 '구역'과 같다
    (올림픽로 4길 42 X동XXX호),(localhost:8080)

API

Application Programming Interface

= 프로그램을 사용할 때 이용되는 인터페이스

REST API

HTTP를 기반으로 하는 웹 서비스 아키텍처
HTTP 메소드와 자원을 이용해 서로 간의 통신을 주고받는 방법(POST, GET, PUT, PATCH, DELETE)

API Endpoint

REST API에서 API Endpoint는 해당 API를 호출하기 위한 HTTP 메소드, 그리고 URL을 포함

RESTful API Endpoint의 설계(Convention)

이제 RESTful한 API의 설계를 위한 규칙 - 방학 매칭 프로젝트 때 큰 도움

RESTful한 API의 Endpoint는 아래의 규칙에 따라 설계

  1. URI에 동사가 포함이 되어선 안된다.
    ex) 회원가입 = POST: /users (/create, /register 쓰지 말 것)
  2. URI에서 단어의 구분이 필요한 경우 -(하이픈)을 이용한다.
  3. 자원은 기본적으로 복수형으로 표현한다.
  4. 단 하나의 자원을 명시적으로 표현을 하기 위해서는 /users/id와 같이 식별 값을 추가로 사용한다.
  5. 자원(Entity) 간 연관 관계가 있을 경우 이를 URI에 표현한다.
    ex) 특정 게시글에 달린 모든 댓글: GET: /posts/comments

세부 API

요청을 보낼 때 추가적으로 보낼 요소들(id, 파라미터 등)을 어떻게 보낼까??

  • Path Variable
    특정한 데이터 객체에 접근할 때
    ex) 특정 게시글에 접근하여 조회: GET: /posts/{postId}
    실제 URL: https://도메인주소/posts/1
  • Query String 요청과 함께 간단한 정보를 보낼 때 - 주로 검색기능에 사용
    스프링 코드에선 RequestParam 사용
  • Request Body URL에 노출이 되지 않고 request body에 해당 데이터를 담을 수 있으며,
    보통 json의 형태 혹은 form-data 형태로 보내는 것 이 때 JSON에 들어갈 정보들을 정해주기 위해 DTO가 사용됨

스프링 프로젝트 생성하기

  • 프로젝트 생성 Java, JDK의 버전을 팀원들과 맞추는 것이 중요
    • 자주 쓰는 종속성 라이브러리들
      Lombok(필수) - 코딩 관련 편의성 → 어노테이션
      Spring Web(필수) - 웹 애플리케이션 개발 프레임워크
      Spring Data JPA(데이터 접근)
      H2/MySQL (데이터베이스 관리)
      Spring Security(로그인할 때 무조건 씀)
      OAuth2(소셜로그인 할 때 사용)

      build.gradle 파일에서 추가/삭제 가능(버전/호출명 구글링 필요)

  • gitignore 설정 팀 프로젝트 때 무조건 깃허브를 사용할 것이기 때문에 ec2 접근키 같은 보안 정보는 gitignore에 추가해야 합니다!!!
    **/resources/application.properties
    **/resources/application.yml
    **/resources/application-common.yml
    **/resources/application-db.yml
    주로 /resources 속에 많이 들어가므로 디렉토리 전체를 넣어줘도 상관없을듯?
  • 디렉토리 정렬 방식 설정
    1. 모듈형(도메인형) 구조

      |-- domain
      |    |-- user
      |    |    |-- controller
      |    |    |-- repository
      |    |    |-- service
      |    |
      |    |-- post
      |    |    |-- controller
      |    |    |-- entity
      |--global
      |    |-- configuration
      |    |-- utils
      |    |-- jwt
    2. 계층형 구조

      |-- controller
      			|-- UserController.java
      			|-- PostController.java
      |-- service
      |-- repository
  • 각종 컨벤션

    네이밍 컨벤션

    1. 클래스 이름: 대문자로 시작하는 카멜케이스 사용 (e.g., UserService)

    2. 메서드 이름: 소문자로 시작하는 카멜케이스 사용 (e.g., getUserById)

    3. 변수 이름: 소문자로 시작하는 카멜케이스 사용 (e.g., totalAmount, userList)

    4. 상수 이름: 모두 대문자와 언더스코어 사용 (e.g., MAX_COUNT)

    5. 패키지 이름: 모두 소문자 (e.g., com.example.project.service)

      주석과 문서화(매우 중요)

    6. 메서드 주석: 각 메서드가 하는 일, 파라미터, 리턴 값 등을 설명

    7. 클래스 주석: 클래스의 책임과 주요 작동 방식 설명

    8. 인라인 주석: 코드 로직이 복잡하거나 주의가 필요할 때 사용

      오류 처리

    9. 예외 처리 방법 (e.g., 커스텀 예외 사용, 예외 전파 방식)

    10. 로그 레벨과 로그 메시지 포맷

      테스트

    11. 단위 테스트 작성 여부와 범위

    12. 테스트 메서드의 네이밍 컨벤션

      Git 관련

    13. 브랜치 전략 (e.g., Git Flow, GitHub Flow)

    14. 커밋 메시지 규칙

어노테이션

본래의 프로그램 로직에는 직접적인 영향을 주지 않지만, 프로그램이 어떻게 동작해야 하는지에 대한 추가적인 정보를 제공 - 메타데이터 **@Annotation** 의 형태

스프링 관련 어노테이션:

  1. @Bean: 특정 메소드의 반환값을 Spring 컨테이너에 빈(Bean)으로 등록
    주로 @Configuration 클래스 내에서 사용
  2. @Service: 클래스를 Spring의 서비스 빈으로 등록
    서비스 로직을 담당하는 클래스에 사용
  3. @Controller / @RestController: 해당 클래스가 웹 요청을 처리하는 컨트롤러 역할을 하는 빈으로 등록
    @RestController는 자동으로 @ResponseBody가 적용되어 반환값을 JSON 등으로 자동 변환
  4. @Autowired: 멤버 변수나 메소드 레벨에서 사용되며, Spring 컨테이너에서 해당 타입의 빈을 자동으로 주입
  5. @Component: 클래스 레벨에서 사용되며, 해당 클래스를 Spring 컨테이너에 빈으로 등록@Service, @Controller, @Repository 등은 @Component를 특화한 형태
  6. @AuthenticationPrincipal: Spring Security관련 어노테이션으로, 사용자의 인증정보(UserDetails)를 더 쉽게 활용할 수 있게 함

JPA 관련 어노테이션:

  1. @Entity: 클래스의 인스턴스가 JPA에서 엔터티 객체임을 명시 이 어노테이션이 붙은 클래스는 데이터베이스의 테이블과 매핑됨
  2. @Id: 변수가 엔터티의 기본 키(primary key)
  3. @GeneratedValue: 주로 @Id와 함께 사용되며, 기본 키의 생성 전략 포함
  4. @Column: 변수가 데이터베이스의 특정 컬럼과 매핑됨
  5. @Table: 엔터티 클래스와 매핑될 데이터베이스 테이블의 이름을 명시 - 없어도 큰 문제는 없음

Lombok 관련 어노테이션:

  1. @Builder: 빌더 패턴을 자동으로 구현
    객체 생성 시 더 간결하고 읽기 쉬운 코드를 작성할 수 있다
  2. **@Getter**: getter 메서드 자동 생성
  3. **@Setter**: setter 메서드 자동 생성
  4. **@NoArgsContructor**: 매개변수가 없는 기본 생성자를 자동으로 생성
  5. @AllArgsConstructor: 클래스의 모든 필드에 대한 생성자를 자동으로 생성
  6. @RequiredArgsConstructor: final 이 붙은 필드에 대한 생성자를 자동으로 생성

0개의 댓글