Lambda
eb나 ec2생성하고 설치하고 설정하는 등 할 게 많으니까,
서버리스 프론트엔드 한 것처럼 설정 없이 서버를 쓸 수 있게 AWS에서 지원하는 서비스
서버가 없다 x
서버를 관리할 필요가 없다 o
람다는 자바로 잘 쓰지 않는다.
컴파일 언어니까 외부에서 컴파일해서 올려야하기 때문에 비교적 파이썬이 더 적합하다
AWS에서는 람다도 너무 오픈하지말고 vpc연결해서 쓰도록 권장한다.
vpc연결하면 설정 없이는 외부통신이 되지 않는다.
보안 그룹에서는 아웃바운드만 신경 써주면 된다.
API Gateway
HTTP 통신을 할 수 있게 HTTP URL, METHOD(GET, POST..) 를 만들어주어 API 엔드 포인트 역할을 해준다.
리소스, 메소드를 생성하고 API를 배포할 수 있다.
스테이지별로 다르게 사용이 가능해 기능을 구분하여 쓸 수 있다.
VPC
비유를 하자면,
VPC: 모뎀
서브넷: 공유기
라우팅 테이블: 모뎀에서 각 방에다 뿌려주는거(모뎀과 공유기 연결)

NAT Gateway 프라이빗한 서블릿을 외부 인터넷과 연결

람다를 생성하지 않은 퍼블릭한 서브넷을 선택하여 생성한다.
Secret ManagerRDS Proxy Server오늘 강의는 람다를 써서 DB에 데이터를 입력하는 과정이었다.
코드는 강의에서 제공받아 진행했다.
처음에는 간단하게 API게이트웨이를 만들어 람다에 파이썬 실행 파일을 올리고 MySQL 포트를 열어서 어렵지 않게 성공했다.
그 다음으로는 Secret Manager 일정 기간마다 PW가 변경되도록 하기
람다 VPC와 연결된 라우팅 테이블과 Nat Gateway를 연결하고, 서브넷 연결
실행 파일에 bucket 설정을 추가하고 S3를 연결해 image 업로드도 진행해 보았다.
네트워크는 정말 어렵게 느껴졌고 복잡하게 다가오지만, 모뎀과 공유기로 예를 들어주셔서 그나마 이해가 쉬웠다. 튜터님도 네트워크는 어려운 게 맞다고 하시니 다행이라면 다행이다,, 네트워크 지식은 개발자에게 필수 지식인 것 같다. 부족한 부분을 채워 나가야겠다.
기능 구현이라고 말은 들었는데 뭔가 객체 지향 구조를 요하는 문제가 나올 것 같았다. 그래서 여유 시간에 객체 지향 복습을 열심히 했는데 예상과는 다른 계산기와 지뢰찾기가...
2차원 배열은 처음이라 좀 낯설었다. 일단 교집합과 차집합 계산기 문제는 foreach문과 stream을 섞어 풀었다. 사실 이중포문 써도 됐을 것 같은데 stream을 써보고 싶어서... 답안에 있는 check 함수는 좀 익숙치 않게 느껴져서 다음에 한 번 써보는 연습을 해야겠다.
// Sum of A - B
// 내 코드
for (int b : B) {
if (IntStream.of(A)
.anyMatch(a -> a != b)) {
result += b;
}
}
// 답안 코드
public int differenceOfSet(int[] A, int[] B)
{
int result = 0;
// for
boolean check = true;
for(int i = 0; i < A.length; i++) {
for(int j = 0; j < B.length; j++) {
if(A[i] == B[j]) {
check = false;
break;
}
}
if(check) {
result += A[i];
}
check = true;
}
// list
result = 0;
List<Integer> listA = Arrays.stream(A)
.boxed()
.collect(Collectors.toList());
List<Integer> listB = Arrays.stream(B)
.boxed()
.collect(Collectors.toList());
listA.removeAll(listB);
//교집합 listA.retainAll(listB)
result = listA.stream().mapToInt(Integer::intValue).sum();
return result;
}
}
지뢰찾기는 답안의 경우 함수를 만들어 하나씩 다 넣어줬고, 나는 반복문을 이용했다.
continue 부분에서 디버깅의 중요성을 느꼈다...
2차원 배열을 망각하고... x값이 0을 넣으면 0이 된다고 멋대로 생각해 i와 j를 0으로 지정해줬더니 자꾸 오류가 났다. 얘랑 실랑이하다가 시간이 없어져서 마지막 문제에서도 실수를 했다...
끝나고 디버깅하는 법 찾아보고 x를 봤더니 반대로 들어갔다. 그제서야 깨닫고 조건을 추가해줬더니 잘 실행됐다.
public int pick(int x, int y) {
int numOfMine = 0;
// todo
if (map[x][y] >= 1) {
return -1;
} else {
for (int i = x; i < (x + 3); i++) {
if (i == 0 || i == 11) continue; // 이 부분
for (int j = y; j < (y + 3); j++) {
if (j == 0 || j == 11) continue; // 여기두
numOfMine += map[i - 1][j - 1];
if (map[i - 1][j - 1] == 0) {
map[i - 1][j - 1] = 2;
}
}
}
}
return numOfMine;
}
마지막으로 모든 부분에 지뢰가 생겼다면 false를 리턴하는 함수였는데 아무래도 시간이 엄청 쬐끔 남아서 정신이 없었다. return도 바꿔 적고 if문 끝에 ; 이걸 넣어서 컴파일 오류가 계속 났다. 결국 실행 안 되는 채로 냈다😭
for (int i = 0; i < map.length; i++) {
int[] a = map[i];
for (int j = 0; j < a.length; j++) {
if (a[j] != 0) return false; //요기
}
}
return true;
아무튼 장족의 발전이다... 난이도 조정을 많이 했다고 하셨으니 쉬워졌긴 했겠지만,, 이번 문제들도 다 푼 것도 아니고 마냥 쉽지도 않았지만,,, 모든 문제 다 건드려본 건 이번이 처음이었다. 아직까지는 자바가 재밌다~~!!
와우 장족의 발전~~!