본문 바로가기
TIL

[231101] 스트림을 배열로 변환, POST와 GET의 차이

by 진진리 2023. 11. 1.
728x90
  • 알고리즘 문제 풀기
  • 프로그래머스의 '배열 조각하기'라는 문제를 풀면서 한 가지 궁금증이 생겼다.

미리 선언한 arr라는 int 배열에 Arrays.copyofRange로 특정 배열의 일부분을 복사할 때 기존 배열의 크기에 맞춰서 값만 대입이 되는 건지(남은 공간은 0으로 채워지는 건지)

아니면 해당 범위로 자른 배열 그 자체가 대입되는 것인지 궁금했다.

 

처음에는 기존 배열의 길이에 맞춰 값이 들어가겠다고 생각했는데

Arrays.copyofRange의 코드로 들어가보니 새로운 길이로 선언한 배열 자체를 리턴해주고 있었다.

    public static int[] copyOfRange(int[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        int[] copy = new int[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

설계하는 입장에서 생각해봤을 때도 값만 복사해오는 것이 더 어려울텐데 왜 처음에는 값만 복사한다고 생각했는지 잘 모르겠다.

아무튼 문제를 풀면서 copyofRange 메소드에 대해서 들여다보는 계기가 되었다.

 

  • 저번에 stack을 int배열으로 반환하기 위해 스트림을 사용하는 방법에 대해 기록했다.
stack.stream().mapToInt(i -> i).toArray();

오늘도 문제를 풀면서 같은 방법으로 스트림을 사용했는데 해당 스트림에 대해 이해를 하지 않고 넘어간 것 같아 이번에 찾아보았다.

IntStream mapToInt(ToIntFunction<? super T> mapper);

mapToInt(i->i)에서 각 스택의 인자 i를 그대로 리턴한다.

따라서 스택의 인자가 ToIntFunction의 매개변수로 들어가고 해당 함수에 의해 int형으로 변환된다.

toArray() 메소드는 기본 타입이 아닌 참조 타입일 경우

메소드 참조 또는 람다 표현식을 사용하여 생성자 함수를 전달해야 한다.

Person[]::new 는 personStream1에서 하나씩 가져온 값을 Person의 생성자에 대입한다.

public static void main(String args[]) {
  List<Person> personList = new ArrayList<>();
  personList.add(new Person("둘리", 10));
  personList.add(new Person("또치", 50));

  Stream<Person> personStream1 = personList.stream();
  Stream<Person> personStream2 = personList.stream();

  // 1. 메서드 참조를 사용하여 생성자 함수 전달
  Person[] personArray1 = personStream1.toArray(Person[]::new);

  // 2. 람다 표현식을 사용하여 생성자 함수 전달
  Person[] personArray2 = personStream2.toArray(size -> new Person[size]);
}

출처: https://developer-talk.tistory.com/765

 

[Java]스트림을 배열로 변환하는 방법(Stream to Array)

스트림을 배열로 변환하는 방법 이번 포스팅은 Stream 클래스에서 제공하는 toArray() 메서드를 사용하여 스트림을 배열로 변환하는 방법을 소개합니다. 방법 1. Stream 클래스의 toArray 메서드 Stream 클

developer-talk.tistory.com


  • Spring 강의

강의에서 메모장 프로젝트를 만드는 수업을 진행하고 있다.

 

처음 HTTP method를 접했을 때 GET은 데이터를 읽고 조회할 때, POST는 데이터를 저장할 때 사용한다는 것을 듣고 나서 POST로 브라우저가 보낸 데이터를 저장한 뒤 서버는 아무런 응답을 하지 않는다고 생각했다.

한다면 성공적으로 저장했다는 메세지 정도?를 하겠다고 짐작했다.

 

그런데 실습 중 '메모 생성하기' 기능을 구현하였는데 POST로 받은 데이터를 RequestDto에 저장한 뒤

Entity인 Memo 클래스의 객체 memo를 만들어 대입한 후, DB(실제로는 해시맵)에 저장한 뒤

해당 entity memo로 다시 ResponseDto를 만들어 리턴한다.

 

검색을 해보니 나와 같은 궁금증을 가진 사람이 있었는데 답변에 따르면

어떤 값을 반환할 지는 클라이언트와 협의해서 정하는 것이 좋고,

보통의 웹 서비스에서 대부분 사용자가 생성한 데이터를 바로 화면에서 확인할 수 있도록 하는 케이스가 많기 때문에

이러한 형태로 많이 구현한다고 한다 !

 

그리고 궁금증을 해결하는 과정에서 GET과 POST의 차이점도 찾아보게 되었다.

확실히, POST도 서버에서 데이터를 전달해준다면 GET과 무슨 차이가 있는건지 궁금해지기 마련이다.

 

아직 웹에 대해 배운지 얼마되지 않아서 이해할 수 있는 내용만 기록하자면 이렇다.

 

GET 메서드의 경우 브라우저 기록에 남고, 데이터 길이에 대한 제한이 있다.

또한 파라미터에 내용이 노출되기 때문에 민감한 데이터를 다룰 때에는 사용해선 안된다.

요청이 성공했을 경우 여러 형식의 데이터와 함께 반환된다.

동일한 요청을 여러 번 수행해도 결과가 달라지지 않는다.

 

POST 메서드의 경우 브라우저 기록에 남지 않고, 길이의 제한 없이 데이터 전송이 가능하다.

내용이 눈에 보이지 않지만 개발자 도구에서는 확인 가능하므로 민감한 데이터의 경우에는 반드시 암호화하여 전송해야 한다.

데이터를 HTTP 메세지의 Body에 담아서 전송하고 body의 타입은 요청 헤더의 Content-Type에 따라 결정된다.

동일한 요청을 여러 번 수행해도 응답은 항상 다를 수 있다.

 

출처: https://velog.io/@songyouhyun/Get%EA%B3%BC-Post%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%A5%BC-%EC%95%84%EC%8B%9C%EB%82%98%EC%9A%94

 

Get과 Post의 차이를 아시나요?

제 질문에 답을 하지 못하겠다면, 이 글을 읽어보시는 걸 적극적으로 추천합니다.

velog.io

 

'TIL' 카테고리의 다른 글

[231103] Spring 개인과제  (0) 2023.11.03
[231102] 배열을 리스트로, 스프링 bean과 싱글톤 패턴  (0) 2023.11.02
[231031] Spring 입문  (0) 2023.10.31
[231030] 팀 프로젝트 KPT 회고  (0) 2023.10.30
[231029] 팀 과제 수정  (0) 2023.10.29