2024-08-12 ~ 18 개념 정리

이선우·2024년 8월 13일
0

개발 관련 지식

목록 보기
4/13

제너럴 타입

제너럴 타입은 자바에서 타입 안정성을 높이고, 코드의 재사용성을 개선하기 위해 도입된 기능

클래스나 메서드, 인터페이스에서 구체적인 데이터 타입을 지정하지 않고도 타입을 매개변수로 받아 사용할 수 있다. -> 이는 컴파일 시 타입 체크를 통해 타입 안정성을 보장하며, 런타임 오류를 줄여준다

예를 들어, 'List'와 같은 형태로 제너럴 타입을 사용하면, 리스트의 요소 타입을 제너럴 타입 매개변수 'T'로 정의할 수 있다.

  
  // 제너럴 타입 T를 사용하는 Box 클래스
public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }

    public static void main(String[] args) {
        // Integer 타입의 Box 객체 생성
        Box<Integer> integerBox = new Box<>();
        integerBox.setContent(123);
        System.out.println("Integer content: " + integerBox.getContent());

        // String 타입의 Box 객체 생성
        Box<String> stringBox = new Box<>();
        stringBox.setContent("Hello, Generics!");
        System.out.println("String content: " + stringBox.getContent());
    }
}  

위의 예제에서 'Box' 클래스는 제너럴 타입 'T'를 사용해 다양한 타입의 객체를 저장할 수 있는 클래스를 정의했다.

public class Util {
  // 제너럴 메서드
  public static <T> boolean isEqual(T a, T b) {
      return a.equals(b);
  }

  public static void main(String[] args) {
      // Integer 타입 비교
      boolean result1 = Util.<Integer>isEqual(10, 10);
      System.out.println("Are integers equal? " + result1);

      // String 타입 비교
      boolean result2 = Util.<String>isEqual("hello", "hello");
      System.out.println("Are strings equal? " + result2);
  }
}

제너럴 타입의 장단점

장점
1. 타입 안정성
2. 코드 재사용성
3. 코드의 가독성

단점
1. 제너럴 타입의 타입 인스턴스화: 제너럴 타입의 인스턴스를 직접 생성할 수 없다. 예를 들어 'new T()'와 같은 생성자는 사용할 수 없다
2. 제너럴 타입의 배열: 제너럴 타입 배열을 직접 생성할 수 없다. 예를 들어 'new T[10]과 같은 형태는 허용되지 않는다.


RestTemplate

RestTemplate는 스프링 프레임워크에서 제공하는 클래스로, Restful 웹 서비스와의 통신을 단순화하고 관리하기 위한 HTTP 클라이언트이다.

주요 기능

  1. HTTP 메서드 지원

  2. 요청 및 응답 처리: JSON, XML 등의 다양한 데이터 포맷을 쉽게 처리할 수 있으며, 객체와 문자열 간의 변화를 지원한다

  3. 타임아웃 설정: 연결 및 읽기 타임아웃을 설정할 수 있다

  4. 요청 헤더 설정: 요청에 다양한 헤더를 추가할 수 있다

    사용하는 경우

  5. RESTful 웹 서비스 호출: 외부 RESTful API와 통신 할 때, 데이터 조회, 생성, 업데이트, 삭제 등의 작업을 수행할 때 사용

  6. 클라이언트 측 API 통합: 스프링 애플리케이션에서 외부 시스템과의 통합이 필요할 때, RestTemplate를 통해 API호출을 간편하게 처리할 수 있다

  7. 서비스 간 통신

    기본 사용법 예시

    
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.client.RestTemplate;

public class RestTemplateGetExample {

public static void main(String[] args) {
    RestTemplate restTemplate = new RestTemplate();
    String url = "https://jsonplaceholder.typicode.com/posts/1";

    // GET 요청
    ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

    // 응답 출력
    System.out.println("Response Body: " + response.getBody());
}

}

위의 코드에서 `restTemplate.getForEntity` 메서드를 사용해서 지정된 URL로 GET요청을 보내고 응답을 `String`으로 받아온다

```java
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

public class RestTemplatePostExample {

  public static void main(String[] args) {
      RestTemplate restTemplate = new RestTemplate();
      String url = "https://jsonplaceholder.typicode.com/posts";

      // POST 요청에 사용할 객체
      String requestJson = "{ \"title\": \"foo\", \"body\": \"bar\", \"userId\": 1 }";

      // 요청에 사용할 HttpHeaders 설정
      HttpHeaders headers = new HttpHeaders();
      headers.set("Content-Type", "application/json");

      // 요청과 헤더를 포함한 HttpEntity 생성
      HttpEntity<String> request = new HttpEntity<>(requestJson, headers);

      // POST 요청
      ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);

      // 응답 출력
      System.out.println("Response Body: " + response.getBody());
  }
}

JsonIgnoreProperties(ignoreUnknown)/JsonProperty

@JsonIgnoreProperties@JsonPreperty는 Jackson 라이브러리에서 JSON 데이터를 직렬화(객체를 JSON으로 변환)하거나 역직렬화(JSON을 객체로 변환)할 때 사용하는 어노테이션이다

@JsonIgnoreProperties

JSOn 데이터의 직렬화 및 역직렬화 과정에서 특정 속성을 무시하도록 설정할 때 사용한다. 이 어노테이션을 클래스에 적용하면, 지정한 속성들이 JSON으로 직렬화되거나 JSON으로부터 역직렬화되는 과정에서 무시된다

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;

@JsonIgnoreProperties(ignoreUnknown = true) // JSON에서 알 수 없는 속성 무시
public class User {
  private String name;
  private int age;

  // getters and setters
  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public int getAge() {
      return age;
  }

  public void setAge(int age) {
      this.age = age;
  }

  public static void main(String[] args) throws Exception {
      String json = "{\"name\":\"John\", \"age\":30, \"unknownProperty\":\"value\"}";
      
      ObjectMapper mapper = new ObjectMapper();
      User user = mapper.readValue(json, User.class);

      System.out.println("Name: " + user.getName());
      System.out.println("Age: " + user.getAge());
  }
}
  ```

User 클래스의 name과 age만을 처리하고 나머지 속성은 무시한다
여기에서 ObjectMapper란
```java
  // 객체를 JSON 문자열로 변환
        String jsonString = objectMapper.writeValueAsString(person);

  // JSON 문자열을 자바 객체로 변환
      Person person = objectMapper.readValue(jsonString, Person.class);

@JsonProperty

위의 어노테이션은 JSON 데이터에서 특정 속성의 이름을 자바 객체의 필드에 매핑할 때 사용한다

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

public class User {
  @JsonProperty("user_name")
  private String name;

  @JsonProperty("user_age")
  private int age;

  // getters and setters
  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public int getAge() {
      return age;
  }

  public void setAge(int age) {
      this.age = age;
  }

  public static void main(String[] args) throws Exception {
      String json = "{\"user_name\":\"John\", \"user_age\":30}";

      ObjectMapper mapper = new ObjectMapper();
      User user = mapper.readValue(json, User.class);

      System.out.println("Name: " + user.getName());
      System.out.println("Age: " + user.getAge());
  }
}

JSON, XML

JSON

JSON은 데이터를 간단하고 읽기 쉬운 형식으로 표현하기 위해 설계된 텍스트 기반의 데이터 포맷이다. 주로 웹 애플리케이션에서 서버와 클라이언트 간의 데이터 교환에 사용한다

특징

  • 형식: 텍스트 기반으로 간결하고 읽기 쉽습니다.

  • 구조: {} (객체)와 로 데이터를 구조화합니다.

  • 데이터 타입: 문자열, 숫자, 객체, 배열, 불리언, null 등이 지원됩니다.

  • 경량: XML보다 데이터 용량이 적어 네트워크 대역폭을 절약할 수 있습니다.

    
    {
      "name": "John Doe",
      "age": 30,
      "isEmployee": true,
      "address": {
          "street": "123 Main St",
          "city": "Anytown",
          "state": "CA"
      },
      "phoneNumbers": [
          "555-1234",
          "555-5678"
      ]
    }
    

    JSON의 장단점
    장점

    • 간결성, 처리 속도, 호환성
      단점

    • 데이터 형식 제한, 메타데이터 부족

      XML

      XML은 데이터를 계층적으로 구조화하고 태그를 사용하여 데이터의 의미를 설명하는 텍스트 기반의 마크업 언어이다. 데이터 저장, 전송, 문서 작성 등 다양한 용도로 사용된다.

      특징

  • 형식: 텍스트 기반으로 태그와 속성을 사용하여 데이터를 설명합니다.

  • 구조: 와 로 데이터를 구조화하며, 태그 내에 속성(attribute)을 포함할 수 있습니다.

  • 데이터 타입: 문자열, 숫자 등 단순 데이터 타입 외에 복잡한 구조를 지원합니다.

  • 자체 설명: 태그와 속성을 통해 데이터의 의미를 설명할 수 있습니다

    <person>
      <name>John Doe</name>
      <age>30</age>
      <isEmployee>true</isEmployee>
      <address>
          <street>123 Main St</street>
          <city>Anytown</city>
          <state>CA</state>
      </address>
      <phoneNumbers>
          <phoneNumber>555-1234</phoneNumber>
          <phoneNumber>555-5678</phoneNumber>
      </phoneNumbers>
    </person>
    

profile
백엔드 개발자 준비생

0개의 댓글