내일배움캠프 D+31: 0518

enyo9rt·2022년 5월 17일

TIL-S

목록 보기
22/79

🌌 Google 클라우드

내부 설정 문제로 생기는 보안 문제가 더 많다
자체 네트워킹 서비스를 사용, dc운영시 안정적으로 운영
순 탄소 배출량 0 달성 환경 친화적
인증을 통해서 권한이 생성된다.

+) MS 클라우드 보안
AzureAD와 WSAD가 다르다는 것 정도로 알아두기
Tenant 기준이 되는 환경! 회사 또는 조직을 의미
>> 사용자 또는 서비스, 구독, 리소스 그룹, 리소스 모든 게 Tenant 내에 존재
계정이 만들어지면 default Tenant가 생성됨.


💻 JAVA 문법 뽀개기

예외, 에러 처리

  • try-catch문

    int num = 10;
    int result;
    for (int i=10;i>=0;i--) {
       try {
           result = num / i;
           System.out.println(result);
       } catch (Exception e) {
           System.out.println("Exception 발생: "+e.getMessage());
       }finally {
           System.out.println("항상 실행되는 finally 구문");
       }
    }
  • try-with-resource문

    • FileOutputStream은 try에 그냥 쓰기만 했을 때는 예외가 발생할 수 있으므로 컴파일에러 표시.
    • IOException의 자손이기 때문에 catch문을 써주면 에러가 없어짐.
    • out 변수가 마지막에 자동으로 파일을 닫아준다.
      try (FileOutputStream out = new FileOutputStream("test.txt")) {
         out.write("Hello Sparta".getBytes());
         out.flush();
      } catch (IOException e) {
         System.out.println("IOException 발생: " + e.getMessage());
         e.printStackTrace();
      }
  • throws

    • 위를 원래 쓰던 try-catch문으로 바꿨다. 파일을 열었으니 닫아줘야 하며 예외 처리를 하지 않아 에러가 뜨기 때문에 throws IOException이라는 예외 처리를 달아준다.
    • throws로 예외를 정해줬다면, 메소드를 호출하는 caller쪽에서는 catch문 등으로 예외 발생 시 어떤 동작을 할 지 알려줘야 한다.
      public static void main(String[] args) throws IOException {
         FileOutputStream out = new FileOutputStream("test.txt");
         try {
             out.write("Hello Sparta".getBytes());
             out.flush();
         } catch (IOException e) {
             System.out.println("IOException 발생: " + e.getMessage());
             e.printStackTrace();
         }
         out.close();
      }

날짜와 시간

  • LocalDate 날짜
  • LocalTime 시간
  • LocalDateTime 날짜+시간
  • Period 기간
  • Formatter 지정 포맷
    다양한 포맷

컬렉션

다수의 데이터를 다루기 위한 자료 구조를 표현하고 사용하는 클래스의 집합!
크기는 size()

  • List 중복 허용
       +: add(e)  | -: remove(idx)  | 조회: get(idx)

    • 배열처럼 크기를 지정해 줄 필요가 없어서 배열보다 많이 쓴다.
    • 컬렉션의 sort로 정렬하면 기본적으로 오름차순 정렬이 된다.
    • 크기는 length가 아닌 size를 사용하고 for-each문의 적용도 가능하다.
  • Set 순서 유지x 중복 허용x
       +: add(e)  | -: remove(e)  | 포함/boolean: contains(e)

    • List를 만들어 removeAll()로 한 번에 삭제 가능
  • Map {키:값}
       +: put(key:value)  | -: remove(e)  | 조회: get(key)
       | 포함/boolean: containsKey(key) containsValue(value)  | 비우기: clear()

  • Stack LIFO (프링글스, 뒤로 가기)
       +: push(e)  | -: pop(e)  | 포함: contains(e)
       | 조회: peek()  | 확인: empty()  | 비우기: clear()

  • Queue FIFO (파이프)
       +: add(e)  | -: poll(e)  | 조회: peek()

  • ArrayDeque
    기본 스택이나 큐의 기능을 다 포함

제네릭스

컴파일 시의 타입 체크를 해주는 기능

        List<String> list = new ArrayList();
        list.add("string");
        Collection<String> collection = list;

        List<Exception> exceptionList = new ArrayList<>();
        Collection<Exception> exceptionCollection = new ArrayList<>();

        List<IllegalAccessException> exceptions = new ArrayList<>();
        exceptionCollection.addAll(exceptions); //addAll(Collection<? extends E> c);
        // 컬렉션 인터페이스 List이면서 꺽쇠 안의 Exception의 자식 클래스인 exceptions는 addAll 가능
        // list는 Exception의 자식 클래스가 아니기 때문에 불가능

람다+스트림

람다
함수의 명세 없이도 실행 가능!
함수를 정의하는 건 아니므로 코드 중복으로 인해 지저분해질 수 있다.

스트림
하나의 데이터의 흐름
대표적으로 컬렉션 이용
데이터 소스를 변경하지 않음
한 번 쓰면 끝나게 됨

  • filter() 조건에 따라 걸러줌
  • collect() 조건에 따라 넣어줌
  • foreach() 각각 실행
  • reduce(첫번째 element 지정, 수행할 함수)

참고1
참고2

네트워킹

네트워크
두 대 이상의 컴퓨터가 연결된 것을 의미
물리적일 수도 있고 무선 네트워크 등을 통해 그렇지 않을 수도 있다.

IP주소
컴퓨터를 구별하는데 사용되는 고유한 위치값

URL
컴퓨터의 방에 들어간다는 뜻!

API
요청과 응답의 데이터 형식에 대한 약속

강의에서는 Retrofit 라이브러리를 사용하여 복잡한 구현들을 감소시킴.
url 주소에 ?는 쿼리스트링(Query String)을 작성하겠다는 신호
>> 이게 쿼리 스트링인 걸 처음 알았다...ㅎㅎ

public interface RetrofitService {
    @GET("/api/users/")
    Call<Object> retrofitTest(@Query("page") int page);
}
//@Query는 Retrofit 라이브러리를 이용할 때 쿼리스트링을 입력하는 방법입니다.(어노테이션)
//이렇게 파라미터 변수로 작성해놓으면 함수를 호출할 때 파라미터를 바꿔가며 원하는 페이지를 조회할 수 있습니다.
public class RetrofitClient {
    private static final String BASE_URL = "https://reqres.in/";
		//BASE_URL에는 변하지 않는 URL주소를 입력해 주면 됩니다. 데이터의 위치에 따라 변하지 않는 주소를 말이죠.

    public static RetrofitService getApi() {
        return getInstance().create(RetrofitService.class);
    }//getInstance 메소드를 통해 인스턴스를 반환하게됩니다.

    private static Retrofit getInstance() {
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();//통신을 할 때 JSON 사용 및 해당 객체로의 파싱을 위해 생성합니다.
        return new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();//서버에서는 JSON으로 응답하므로 우리는 build.gradle에 설정한 gson을 이용합니다.
    }
}
public class Main {
    public static void main(String[] args) {
        Call<Object> retrofitTest = RetrofitClient.getApi().retrofitTest(2);//우리는 2페이지를 확인할 것이기 때문에 2를 삽입하겠습니다.
				//Call은 retrofit라이브러리의 인터페이스이며 서버에서 응답하는 값을 담는 역할을 합니다.
        try {
            System.out.println(retrofitTest.execute().body());//서버에서 받은 데이터를 확인해보겠습니다. execute()해줘야 실제 요청이 된다.
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이건 진짜 이해가 아니라 ajax처럼 형태를 알고 써야 할 것 같다...뭐라고 하는지😵


SAVE 💾

클라우드 프로젝트로 VM에 1차 프로젝트를 배포해서 링크를 제출해야 했다. 그냥 VM으로 배포하면 됐는데 나는 VMSS에 해야하는 줄 알고 한참을 헤맸다... 결국 하긴 했는데 다른 팀원분께도 시간을 쓰게 만들어서 죄송했다ㅠㅠ 아무튼 되긴 됐는데 포트 열어준 건 다를 바 없는데 왜 안 되다가 된 건지... 도통 알 수 없는 포트의 세계다;;; 인바운드 NAT으로 백 엔드 풀에 SSH 포트를 따로 열어줘서 VMSS 내의 인스턴스에 파일을 올리고 보안 그룹에서 http와 80번 포트를 열어 접속되도록 했다. 클라우드도 기본 틀은 비슷해서 프로그래밍 언어처럼 하나를 제대로 익혀두면 큰 시행 착오 없이 사용할 수 있을 듯하다. 특히 MS 클라우드는 AWS보다 사용설명서?가 더 잘 되어있는 느낌을 받았다.

0개의 댓글