[ KOSTA 교육 22일차 ] Collection Framework & Generic 복습 | Entity, VO, 가 등장한 과정 ( String[] -> List<List<String>>, List<Map<String,String>>, List<ClassName> : List<VO> | REST API 호출 이후 Collection Framework에 담기

junjun·2024년 5월 14일
0

KOSTA

목록 보기
19/48

배열 & ArrayList

  • 연속된 메모리 할당
    • 캐시의 지역성 ( 공간 지역성 ) 활용 가능
  • 추가/수정/조회 연산(인덱스를 안다면) 빠름 ( O(1) ),
    중간값 수정, 삭제 연산 느림
    ( 찾는 시간 : O(N), 삭제하고 앞으로 다시 밀어버리는 시간 추가되어 느림 )

제네릭

  • (컴파일 시) 클래스, 메서드 등에서 사용할 데이터 ( 타입을 미리 지정 )하는 방법
  • 컴파일 시 컴파일러가 사전에(Runtime 전에) 타입을 체크한다.
  • 타입 안정성, 코드 가독성, 런타임 시 오버헤드 감소

ORM : MyBatis ( iBatis ), Hibernate( JPA )

  • Hibernate → SQL 이 600라인이라면.. ( 쿼리가 짧을 경우 )
  • MyBatis → SQL이 복잡할 때 좋음.
  • 프로젝트 규모가 작다 → MyBatis

VO, DTO

/**
//-----------------------------------
// Entity 클래스 : 값을 넣고 빼기 위한 용도의 클래스
//   - VO : Value Object(읽기)
//   - DTO : Data Transfer Object(읽기/수정)
//   
//  private int num;
//  setter() : 넣기    --> get+프로퍼티명()
//  getter() : 꺼내기   --> set+프로퍼티명()
//-----------------------------------
*/

! (EMPNAME, EMPNO, SAL) = (”SMITH”, “7733”, “600”) 인 튜플을
List<Map<String,String>> 으로 담고, for문을 활용하여 출력하는 코드를 작성하라.

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

public class EmpTest {

	public static void main(String[] args){
		List<Map<String,String>> empVO = new ArrayList<>();
		String[] columns = new String[]{"empno", "ename", "sal"};
		String[][] values = {
					{"7733", "smith", "600"}
				};	
		
		for(int i = 0; i < values.length; i++){
			empVO.add(new HashMap<>());
			for(int j = 0; j < columns.length; j++){
				empVO.get(i).put(columns[j], values[i][j]);
			}
		}
		
		for(int i = 0; i < empVO.size(); i++){
			Map<String, String> currTuple = empVO.get(i);
			for(String key : currTuple.keySet()){
				System.out.println(key + " : " + currTuple.get(key));
			}
		}
	}
}
  • Map의 인스턴스화가 되지 않아 문제가 있었다.

!! Java에서 String → JSON으로 바꿔주는 라이브러리가 있다.

이를 활용하여 JSON 형식의 데이터를 읽을 수 있다.

  • **MAVEN**에서 가져오면 된다. ( JDK 자체가 지원하지 않는 API들.. )
    ( https://mvnrepository.com/search?q=json )
    - 자바에서 안주는 API는 maven 이라는 외부 라이브러리에서 가져오면 된다.
    - JSONObject, JSONParser
JSONParser jsonParser = new JsonParser();
JSONObject map = (JSONObject) jsonParser.parse(parse(strJson));
  • Jackson
    • **com.fasterxml.jackson.databind.ObjectMapper;**
ObjectMapper mapper = new ObjectMapper();
HashMap map = mapper.readValue("UTF-8", HashMap.class);

JDK에 직접 외부 JAR를 넣지 말 것,

나중에 Spring에서 maven, gradle이 자동으로 다운로드 받는 버전과 충돌이 날 수도 있다.
외부 Library를 직접 JDK에 넣지 말고, etc/jar 라는 폴더를 만들어서 환경 격리 해준 이유이다.

Map에 데이터를 담으면 이름을 지정해줘야해서 불편하다.

→ VO를 사용해야하는 이유.

Getter, Setter와 Java Bean Property 규약.

  • Camel Case로 자동 생성된다.
  • 이렇게 생성된 메서드의 이름은 Reflection API를 통해 프레임워크에서 호출한다.
  • 예를 들어, Spring 의 Argument Resolver에서 이 메서드를 통해 @RequestParam, @ModelAttribute로 보고 해당 이름의 Property 규약 메서드를 찾을 것이다.

같은 패키지에 있는 클래스들에 대해서는

서로 import 안해도 된다.

Maven을 통한 외부 API 가져오기

  • JAR 로 다운로드 받는 방식
  • maven 사용하여 CDN 방식으로 가져오기

Jackson API

  • Factory
  • Config
  • 문제 : Jackson API의 ObjectMapper를 사용하여,
    JSON 형식의 String ( 직렬화 = 바이트화 된 데이터 : byte[] )을
    VO Class로 매핑하라. 혹은, Map.class 로 매핑하라.
    해당 결과물 객체를 출력하기.

import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;

public class JacksonTest {

public static void main(String[] args) {
	// EmpVO (1) : str --> EmpVO
	ObjectMapper objectMapper = new ObjectMapper();
	String jsonStr = 
			"{\"ename\":\"smith\", "
			+ "\"empno\":\"7733\", "
			+ "\"sal\":\"600\"}";
	
	try {
		EmpVO evo = objectMapper.readValue(jsonStr,EmpVO.class);
		System.out.println(evo);
	} catch(JsonProcessingException e){
		System.out.println("objectMapper.readValue() 실패");
		e.printStackTrace();
	}
	
	HashMap<String, String> map = new HashMap<>();
	// HashMap : str --> HashMap
	try {
		map = objectMapper.readValue(jsonStr, HashMap.class);
	} catch(JsonProcessingException e) {
		System.out.println("objectMapper.readValue() 실패");
		e.printStackTrace();
	}
	
	// map --> str
	System.out.println(map);
	// Jackson : Factory , Config가 뭘 하는가.
	
	// Jackson API
	
}

}

0개의 댓글