제너럴 타입은 자바에서 타입 안정성을 높이고, 코드의 재사용성을 개선하기 위해 도입된 기능
클래스나 메서드, 인터페이스에서 구체적인 데이터 타입을 지정하지 않고도 타입을 매개변수로 받아 사용할 수 있다. -> 이는 컴파일 시 타입 체크를 통해 타입 안정성을 보장하며, 런타임 오류를 줄여준다
예를 들어, '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
는 스프링 프레임워크에서 제공하는 클래스로, Restful 웹 서비스와의 통신을 단순화하고 관리하기 위한 HTTP 클라이언트이다.
HTTP 메서드 지원
요청 및 응답 처리: JSON, XML 등의 다양한 데이터 포맷을 쉽게 처리할 수 있으며, 객체와 문자열 간의 변화를 지원한다
타임아웃 설정: 연결 및 읽기 타임아웃을 설정할 수 있다
요청 헤더 설정: 요청에 다양한 헤더를 추가할 수 있다
RESTful 웹 서비스 호출: 외부 RESTful API와 통신 할 때, 데이터 조회, 생성, 업데이트, 삭제 등의 작업을 수행할 때 사용
클라이언트 측 API 통합: 스프링 애플리케이션에서 외부 시스템과의 통합이 필요할 때, RestTemplate
를 통해 API호출을 간편하게 처리할 수 있다
서비스 간 통신
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
와 @JsonPreperty
는 Jackson 라이브러리에서 JSON 데이터를 직렬화(객체를 JSON으로 변환)하거나 역직렬화(JSON을 객체로 변환)할 때 사용하는 어노테이션이다
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);
위의 어노테이션은 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은 데이터를 간단하고 읽기 쉬운 형식으로 표현하기 위해 설계된 텍스트 기반의 데이터 포맷이다. 주로 웹 애플리케이션에서 서버와 클라이언트 간의 데이터 교환에 사용한다
특징
형식: 텍스트 기반으로 간결하고 읽기 쉽습니다.
데이터 타입: 문자열, 숫자, 객체, 배열, 불리언, 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은 데이터를 계층적으로 구조화하고 태그를 사용하여 데이터의 의미를 설명하는 텍스트 기반의 마크업 언어이다. 데이터 저장, 전송, 문서 작성 등 다양한 용도로 사용된다.
특징
형식: 텍스트 기반으로 태그와 속성을 사용하여 데이터를 설명합니다.
구조: 와 로 데이터를 구조화하며, 태그 내에 속성(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>