728x90

상황)

SQL로 Select했을 때 name 칼럼에 클래스의 변수명이 들어있어서 DTO에 넣으려면 name 칼럼의 값을 확인하고 DTO와 매칭 시켜서 값을 담아주어야 한다.

 

과정)

하나하나 setter로 모두 담아주려고 보니 코드가 길어지고 가독성이 떨어지는 것 같아서 한번에 담을 수 없을까라는 생각에 리플렉션을 공부하게 되었다.

 

리플렉션이란?

리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

 

리플렉션을 언제 사용하는가?

정적 언어인 자바를 동적인 문제로 해결해야 하는 경우가 있는데 이때 리플렉션을 사용한다고 한다.

클래스의 변수 명을 비교한 뒤 값을 넣어주어야 하는 나의 상황도 이러한 상황이라고 할 수 있을 것 같다.

 

리플렉션은 애플리케이션 개발보단 프레임워크, 라이브러리에서 많이 사용된다.

프레임워크, 라이브러리는 사용하는 사람이 어떤 클래스를 만들지 모르기 때문에 동적으로 해결해주기 위해 리플렉션을 사용한다고 한다.

 

대표적인 사용 예로는 스프링의 DI, Proxy, ModelMapper 등이 있다.

 

사용 예시)

class Ad {
    private int idx;
    private String title;
    private String content; 
}
 
Class<Ad> c = Ad.class;
Field[] fields = class.getDeclaredFields();

for (final Field field : fields) {
    System.out.printf("%s %s\n", field.getType(), field.getName());
}
 

 

 

 

 

참고 자료

 

https://dublin-java.tistory.com/m/53

 

728x90

'Java' 카테고리의 다른 글

ObjectMapper  (0) 2022.08.24
@PostConstruct, @PreDestroy  (0) 2022.08.24
UnrecognizedPropertyException  (0) 2022.08.23
JsonNode to Object  (0) 2022.08.23
mac 자바 8 설치  (0) 2022.08.19
728x90

Jackson에서 제공하는 클래스이고, Java 클래스 내용을 확인하거나 파싱하는 과정에서

Object를 Json으로 변환하거나 Json을 Object로 변환할 때 사용한다고 한다.

 

Dependency 추가

<artifactId>jackson-databind</artifactId>

 

Object ➡️ Json

ObjectMapper objectMapper = new ObjectMapper();
User user = new User("meanji", 100);

objectMapper.writeValue(new File("user.json"), user);
String userAsString = objectMapper.writeValueAsString(user);

Json ➡️ Object

String json = "{ \"name\" : \"meanji\", \"age\" : 100 }";
User user = objectMapper.readValue (json, User.class);

Json ➡️ Jackson JsonNode

String json = "{ \"name\" : \"meanji\", \"age\" : 100 }";
JsonNode jsonNode = objectMapper.readTree(json);
String name = jsonNode.get("name").asText();
int age = jsonNode.get("age").asInt();

Json Array String ➡️ Java List

String jsonArr = "[{\"name\":\meanji\",\"age\":30},{\"name\":\"Jason\",\"age\":20}]";
List<User> user = objectMapper.readValue(jsonArr, new TypeReference<>() {});

Json String ➡️ Java Map

String jsonArr = "{\"name\":\"Ryan\",\"age\":30}";
Map<String, Object> user = objectMapper.readValue(jsonArr, new TypeReference<>() {});

Reference

https://interconnection.tistory.com/137

728x90

'Java' 카테고리의 다른 글

[Java] 리플렉션 공부  (0) 2022.10.25
@PostConstruct, @PreDestroy  (0) 2022.08.24
UnrecognizedPropertyException  (0) 2022.08.23
JsonNode to Object  (0) 2022.08.23
mac 자바 8 설치  (0) 2022.08.19
728x90

@PostConstruct

Spring은 빈 속성 초기화 직후에 @PostConstruct로 주석이 달린 메서드를 한 번만 호출한다.

(초기화할 항목이 없는 경우에도 메서드 실행)

@PostConstruct가 있는 메서드는 static 할 수 없다.

 

기본 사용자를 만들기 위해 사용하는 예시)

@Component
public class DbInit {
    
    @Autowired
    private UserRepository userRepository;
    
    @PostConstruct
    private void postConstruct() {
        User admin = new User("admin", "admin password");
        User normalUser = new User("user", "user password");
        userRepository.save(admin, normalUser);
    }
}
    @PostConstruct
    private void init() {
        restTemplate.setErrorHandler(new ResponseErrorHandler() {
            @Override
            public boolean hasError(ClientHttpResponse response) {
                return false;
            }

            @Override
            public void handleError(ClientHttpResponse response) {
            }
        });
    }

쓰면서 이런 예시를 보고 @PostConstruct에 대해 조사해 본 건데 아직은 좀 헷갈리는 것 같다.

 

@PreDestroy

Spring이 애플리케이션 컨텍스트에서 빈을 제거하기 직전에 한 번만 실행된다.

@PostConstruct와 마찬가지로 static할 수 없다.

@Component
public class UserRepository {
    
    private DbConnection dbConnection;
    @PreDestroy
    public void preDestroy() {
         dbConnection.close();
    }
}

 

 

@PostConstruct와 @PreDestroy 모두 Java EE의 일부이다. Java EE는 Java9에서 더이상 사용되지 않고, Java11에서 제거 되었기 때문에 사용하려면 종속성을 추가해야 한다.


Reference

https://www.baeldung.com/spring-postconstruct-predestroy

728x90

'Java' 카테고리의 다른 글

[Java] 리플렉션 공부  (0) 2022.10.25
ObjectMapper  (0) 2022.08.24
UnrecognizedPropertyException  (0) 2022.08.23
JsonNode to Object  (0) 2022.08.23
mac 자바 8 설치  (0) 2022.08.19
728x90

ObjectMapper로 JsonNode를 Class에 넣어주는 코드에서 UnrecognizedPropertyException 가 발생했다.

mId라고 분명 클래스에 저장했는데, mid라고 인식하는 것 때문에 필드명 에러를 뱉어냈다.

 

@JsonIgnoreProperties를 선언하면 무시하고 작업을 수행한다.

하지만, mId가 null로 들어가기 때문에

@JsonProperty를 써서 직접 mId로 지정 해주었다.

@Getter
@Setter

@JsonIgnoreProperties(ignoreUnknown = true)
public class PaymentInfoDTO {
    @JsonProperty("mId")
    String mId;
}

 

 

728x90

'Java' 카테고리의 다른 글

[Java] 리플렉션 공부  (0) 2022.10.25
ObjectMapper  (0) 2022.08.24
@PostConstruct, @PreDestroy  (0) 2022.08.24
JsonNode to Object  (0) 2022.08.23
mac 자바 8 설치  (0) 2022.08.19
728x90

JsonNode는 Jackson 라이브러리에서 제공하는 객체이다.

토스페이먼츠 결제 후 반환 값이 JsonNode로 반환되는데,

잘 몰라서 아래의 대참사를 만들어냈다 (허허)

 

무지함이 불러온 대참사...

 

찾아보니 JsonNode를 클래스 객체로 변환할 수 있었다.

(jackson 라이브러리 추가되어 있어야 한다!)

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jacdson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
// 클래스 생략

public PaymentInfoDTO JsonNodeToObject(successNode) {
    try {
        ObjectMapper mapper = new ObjectMapper();
        PaymentInfoDTO paymentInfo = mapper.treeToValue(successNode, PaymentInfoDTO.class);
        return paymentInfo;
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return null;
}

Reference

https://hianna.tistory.com/637

 

 

728x90

'Java' 카테고리의 다른 글

[Java] 리플렉션 공부  (0) 2022.10.25
ObjectMapper  (0) 2022.08.24
@PostConstruct, @PreDestroy  (0) 2022.08.24
UnrecognizedPropertyException  (0) 2022.08.23
mac 자바 8 설치  (0) 2022.08.19
728x90

자바 8 설치 방법

이 곳에서 macOS를 선택한 뒤 jdk-8u321-macosx-x64.dmg를 다운로드

다운로드 후 열고 설치를 진행

설치를 마친 뒤 터미널에 다음 명령어를 입력하면 설치된 자바를 모두 확인할 수 있다.

/usr/libexec/java_home -V

 

자바 버전 변경

방금 설치한 자바로 버전을 변경하기 위해 터미널에 다음 명령어를 입력한다.

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

 

자바 8과 자바 1.8 차이

예전부터 자바 8이 왜 1.8일까 궁금했는데 찾아보니(참고)

11 부터는 그냥 11로 사용하고 8은 1.8, 7은 1.7, 6은 1.6 --- 이런식으로 사용한다고 한다.

8은 Version Number이고 이 버전에 대한 Version String은 1.8이라고 한다.

 

728x90

'Java' 카테고리의 다른 글

[Java] 리플렉션 공부  (0) 2022.10.25
ObjectMapper  (0) 2022.08.24
@PostConstruct, @PreDestroy  (0) 2022.08.24
UnrecognizedPropertyException  (0) 2022.08.23
JsonNode to Object  (0) 2022.08.23

+ Recent posts