Burninghering's Blog
article thumbnail

빌드란?

 - 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정 또는 그에 대한 결과물이다.
 - 이를 좀더 쉽게 풀어 말하자면 우리가 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원 등(.xml, .jpg, .jar, .properties)을 JVM이나 톰캣같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다.

 

빌드 도구(Build tool)

 - 빌드 도구란 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램.
 - 빠른기간동안 계속해서 늘어나는 라이브러리 추가, 프로젝트를 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장.
 - 초기의 java 빌드도구로 Ant를 많이 사용하였으나 최근 많은 빌드도구들이 생겨나 Maven이 많이 쓰였고, 현재는 Gradle이 많이 쓰인다.
(Ant는 스크립트 작성도 많고, 라이브러리 의존관리가 되지 않아 불편함)

 

Maven

정의 및 특징

 - Maven은 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌다.
 - Maven은 Ant와 마찬가지로 프로젝트의 전체적인 라이프 사이클을 관리하는 도구 이며, 많은 편리함과 이점이 있어 널리 사용되고 있다.

 - Maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다.
 - Maven은 중앙 저장소를 통한 자동 의존성 관리를 중앙 저장소(아파치재단에서 운영 관리)는 라이브러리를 공유하는 파일 서버라고 볼 수 있고, 메이븐은 자기 회사만의 중앙 저장소를 구축할수도 있다.
 - 간단한 설정을 통한 배포 관리가 가능 하다.

 

출처: https://goddaehee.tistory.com/199 [갓대희의 작은공간:티스토리]


웹 서버 web server

(웹 서비스를 할 수 있는 환경을 구축하기 위해 사용하는 소프트웨어)

 서버(web server)는 다음의 두 가지 뜻 가운데 하나이다.

  1. 웹 서버  : 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
  2. 웹 서버 (하드웨어) : 위에 언급한 기능을 제공하는 컴퓨터 프로그램을 실행하는 컴퓨터

웹 서버(web server)는 HTTP 또는 HTTPS를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스 프로그램을 말한다.

웹 서버 소프트웨어를 구동하는 하드웨어도 웹 서버라고 해서 혼동하는 경우가 간혹 있다.


apache 란?

apach란 것은 소프트웨어 단체 이름이다.

그리고 우리가 흔히 부르는 아파치서버라는 것은 이제단에서 후원하는 오픈소프 프로젝트 커뮤니티에서 만든 http웹서버를 지칭하는 말이다. (아파치 프로젝트는 웹서버 외에도 여러가지 프로젝트를 진행하고 있다고 한다. 이건 추후에 조사해볼것이다.)

http 웹서버는 http 요청을 처리할 수 있는 웹서버이고, 아파치 http서버는 http요청을 처리하는 웹서버인 것이다. 클라이언트가 GET, POST, DELETE 등등의 메소드를 이용해 요청을 하면 이 프로그램이 어떤 결과를 돌려주는 기능을 한다. 아파치는 웹서버 이다!

tomcat 이란?

tomcat은 흔히 WAS(Web Application Server)라고 말한다.

WAS는 웹 서버와 웹 컨테이너의 결합으로 다양한 기능을 컨테이너에 구현하여 다양한 역할을 수행할 수 있는 서버를 말한다.

클라이언트의 요청이 있을 때 내부의 프로그램을 통해 결과를 만들어내고 이것을 다시 클라이언트에 전달해주는 역할을 하는 것이 바로 웹 컨테이너 이다.

앞에서 본 아파치 웹 서버와 차이는 이 컨테이너 기능이 가능하냐의 차이가 가장 크다고 생각한다. 

 이미지출처 : http://gap85.tistory.com/45

WAS역시 웹 서버로써 역할을 수행할 수 있기 때문에 둘을 잘 구별하지 못하면 필자 같은 혼란이 생길 수 있다.

둘의 차이는?

그렇다면 WAS만 쓰면 되지 어째서 웹서버를 따로 쓰느냐는 의문이 생길 수 있다. 그 이유는 목적이 다르기 때문이다. 웹 서버는 정적인 데이터를 처리하는 서버이다. 이미지나 단순 html파일과 같은 리소스를 제공하는 서버는 웹 서버를 통하면 WAS를 이용하는 것보다 빠르고 안정적이다(왜? 다른 글 소스로 써볼까?) WAS는 동적인 데이터를 처리하는 서버이다. DB와 연결되어 데이터를 주고 받거나 프로그램으로 데이터 조작이 필요한 경우에는 WAS를 활용 해야 한다.

기타(리눅스에서 설치 및 연동하기)

두 서버의 목적의 차이 때문에 두 개의 서버를 연동해서 사용하면 더욱 효과적인 서비스를 제공할 수 있다. 사용자 요청은 http 웹 서버를 통해 받고 내부 프로그램은 was를 통해 처리하는 식으로 한다면 정적인 데이터와 동적인 데이터를 효과적으로 처리가 가능할 것이다.

출처

 

was와 웹서버의 차이 – 톰캣과 아파치를 구별하지 못하는 사람을 위해 › Blog For Me

평소 tomcat과 apache를 잘 구분하지 못하여 공부한 내용을 정리해 본다. 아파치 톰캣을 이용해서 웹서버를 띄우고 개발을 진행해왔다. 그런데 실제 일을 하면서 서버를 실핼할때 단순히 tomcat만 쓰

sungbine.github.io


Maven Repository에서 

object mapper를 검색 후 가장 많이 쓰는 도구와 가장 많이 쓰이는 버전 Gradle 용을 복사해와서

Dependancy에 붙인 후 Gradle 새로고침을 해주었다

 

그리고 Sample.json 만듦

{
  "name": "홍길동",
  "age": 10,
  "cars": [
    {
      "name": "K5",
      "car_number":"11가 1111",
      "TYPE":""
    },
    {
      "name": "Q5",
      "car_number":"11가 1111",
      "TYPE":""
    }
  ]
}

 

기본 뼈대 만들기

User.java

package dto;

import java.util.List;

public class User {
    private String name;
    private int age;
    private List<Car> cars;

    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 List<Car> getCars() {
        return cars;
    }

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cars=" + cars +
                '}';
    }
}

Car.java

package dto;

public class Car {
    private String name;
    private String carNumber;
    private String type;

    public String getName() {
        return name;
    }

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

    public String getCarNumber() {
        return carNumber;
    }

    public void setCarNumber(String carNumber) {
        this.carNumber = carNumber;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", carNumber='" + carNumber + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

 

 

 

https://tecoble.techcourse.co.kr/post/2020-05-18-ArrayList-vs-Arrays.asList/

 

new ArrayList<>() vs Arrays.asList()

List를 만들때 대부분은 와 를 사용하여 만든다. 그럼 와 의 차이를 알고 사용하고 있는가? 이번 글에서는 두개의 차이점을 알아볼 것이다. 1. return type 와 는 다른 클래스다. 는 ArrayList를 는 Arrays

tecoble.techcourse.co.kr

 

Main.java

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import dto.Car;
import dto.User;

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String args[]) throws JsonProcessingException {
        System.out.println("main");

        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.setName("김혜린");
        user.setAge(10);

        Car car1 = new Car();
        car1.setName("K5");
        car1.setCarNumber("11가 1111");
        car1.setType("sedan");

        Car car2 = new Car();
        car2.setName("Q5");
        car2.setCarNumber("22가 2222");
        car2.setType("SUV");

        List<Car> carList= Arrays.asList(car1,car2);
        //[Car{name='K5', carNumber='11GA 1111', type='sedan'}, Car{name='Q5', carNumber='22GA 2222', type='SUV'}]

        user.setCars(carList);

        //오브젝트 맵퍼로 json을 바꿔보자
        String json = objectMapper.writeValueAsString(user); //string으로 바꾸는 기능
        System.out.println(json);
    }
}

 

결과가 카멜 케이스로 나오니,

어노테이션을 줘서 스네이크 케이스로 바꾸자

package dto;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Car {
    private String name;

    @JsonProperty("car_number") //<-요기
    private String carNumber;

    @JsonProperty("TYPE") //<-요기
    private String type;

    public String getName() {
        return name;
    }

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

    public String getCarNumber() {
        return carNumber;
    }

    public void setCarNumber(String carNumber) {
        this.carNumber = carNumber;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", carNumber='" + carNumber + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}


 직접 노드에 접근할 수 있는 방법은 없을까?

파싱을 해보자

//파싱해보자~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
JsonNode jsonNode=objectMapper.readTree(json);
String _name = jsonNode.get("name").asText();
int _age=jsonNode.get("age").asInt();

System.out.println("name : " +_name);
System.out.println("name : " +_age);

 

cars같은 노드들이 들어간 json은 파싱하기 어렵네.. 아래 코드처럼 해봅시다

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import dto.Car;
import dto.User;

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String args[]) throws JsonProcessingException {
        System.out.println("main");

        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.setName("김혜린");
        user.setAge(10);

        Car car1 = new Car();
        car1.setName("K5");
        car1.setCarNumber("11가 1111");
        car1.setType("sedan");

        Car car2 = new Car();
        car2.setName("Q5");
        car2.setCarNumber("22가 2222");
        car2.setType("SUV");

        List<Car> carList= Arrays.asList(car1,car2);
        //[Car{name='K5', carNumber='11GA 1111', type='sedan'}, Car{name='Q5', carNumber='22GA 2222', type='SUV'}]

        user.setCars(carList);

        //오브젝트 맵퍼로 json을 바꿔보자
        String json = objectMapper.writeValueAsString(user); //string으로 바꾸는 기능
        System.out.println(json);


        //파싱해보자~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        JsonNode jsonNode=objectMapper.readTree(json);
        String _name = jsonNode.get("name").asText();
        int _age=jsonNode.get("age").asInt();

        System.out.println("name : " +_name);
        System.out.println("name : " +_age);
        //위와 같은 부분들은 KEY-VALUE값인데,

        //cars는 json의 새로운 노드, 즉 배열이기 때문에 아래처럼 못 가져온다
//        String _list = jsonNode.get("cars").asText();
//        System.out.println(_list);

        JsonNode cars = jsonNode.get("cars");
        ArrayNode arrayNode = (ArrayNode)cars; //cars는 배열의 노드기 때문에
        //object mapper의 클래스인 ArrayNode를 사용, (ArrayNode)cars -> 타입 변환해서 강제 파싱

        List<Car> _cars = objectMapper.convertValue(arrayNode,new TypeReference<List<Car>>(){});
        //covertValue ->  여러가지 object를 json이 아닌 우리가 원하는 클래스로 바꿀 수 있음
        // TypeReference에는 우리가 원하는 제네릭 타입 <List<Car>> 넣어주기
        //arrayNode라는 오브젝트를 받아서, 우리가 원하는 타입 (List의 car)라는 List형태로 변환

        System.out.println(_cars);
    }
}

 

미리 해당 json의 표준 스펙을 알고

arrayNode는 이런식으로 접근을 한다

 

object에 접근할 때는 jsonNode.get하면 접근 가능

형변환은 asText(),asInt()로 하면 된다.

 

array같은 경우는 arrayNode로 변환시킨 다음에

파싱을 할 때 convertValue를 통해 오브젝트를 넣고 우리가 원하는 타입을 넣는 오브젝트맵퍼의 역할이 있다

 

이렇게 활용해서

전체적인 노드를 파싱할 수 있다.

 

왜 하냐면

json 안의 값을 우리가 바꿔줄 수 있기 때문이다

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import dto.Car;
import dto.User;

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String args[]) throws JsonProcessingException {
        System.out.println("main");

        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.setName("김혜린");
        user.setAge(10);

        Car car1 = new Car();
        car1.setName("K5");
        car1.setCarNumber("11가 1111");
        car1.setType("sedan");

        Car car2 = new Car();
        car2.setName("Q5");
        car2.setCarNumber("22가 2222");
        car2.setType("SUV");

        List<Car> carList= Arrays.asList(car1,car2);
        //[Car{name='K5', carNumber='11GA 1111', type='sedan'}, Car{name='Q5', carNumber='22GA 2222', type='SUV'}]

        user.setCars(carList);

        //오브젝트 맵퍼로 json을 바꿔보자
        String json = objectMapper.writeValueAsString(user); //string으로 바꾸는 기능
        System.out.println(json);


        //파싱해보자~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        JsonNode jsonNode=objectMapper.readTree(json);
        String _name = jsonNode.get("name").asText();
        int _age=jsonNode.get("age").asInt();

        System.out.println("name : " +_name);
        System.out.println("name : " +_age);
        //위와 같은 부분들은 KEY-VALUE값인데,

        //cars는 json의 새로운 노드, 즉 배열이기 때문에 아래처럼 못 가져온다
//        String _list = jsonNode.get("cars").asText();
//        System.out.println(_list);

        JsonNode cars = jsonNode.get("cars");
        ArrayNode arrayNode = (ArrayNode)cars; //cars는 배열의 노드기 때문에
        //object mapper의 클래스인 ArrayNode를 사용, (ArrayNode)cars -> 타입 변환해서 강제 파싱

        List<Car> _cars = objectMapper.convertValue(arrayNode,new TypeReference<List<Car>>(){});
        //covertValue ->  여러가지 object를 json이 아닌 우리가 원하는 클래스로 바꿀 수 있음
        // TypeReference에는 우리가 원하는 제네릭 타입 <List<Car>> 넣어주기
        //arrayNode라는 오브젝트를 받아서, 우리가 원하는 타입 (List의 car)라는 List형태로 변환

        System.out.println(_cars);

        ObjectNode objectNode = (ObjectNode) jsonNode;
        objectNode.put("name","Steve");
        objectNode.put("age",23);

        System.out.println(objectNode.toPrettyString());
        //toPrettyString는 json을 예쁘게 출력함!
    }
}

 

json string으로 된 값을 바꿔주거나 

각각의 노드에 대해 설정을 바꾸고 

전체 노드를 바꿀수도 있다는 방법을 알려주는 것

 

오브젝트맵퍼를 통해 각각의 노드에 접근할 수 있으며,

우리가 원하는 형태로 json을 바꿀 수 있다

'Spring' 카테고리의 다른 글

Custom Validation  (0) 2022.06.05
Validation  (0) 2022.06.01
error: unmappable character (0x80) for encoding x-windows-949 오류 해결  (1) 2022.05.29
스프링의 핵심 IOC & DI & AOP(활용)  (0) 2022.05.22
Object Mapper  (0) 2022.04.23
profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.