ALL Post 204

외부 시스템에 덜 의존하게 만들기

이전 글 예외처리에 대한 잡설에 이어서 지난 몇 달 간 아파트 입주민이 사용하는 방문예약 시스템을 개발했다. 입주민이 방문 차량을 예약하면 우리 시스템은 아파트 차단기를 관리하는 외부 시스템에 요청을 보내서, 예약된 차량이 간편하게 입차할 수 있게 하는 서비스다. 이 시스템의 아이덴티티는 예약하면 차단기가 열린다는 것이다. 그런데 우리는 차단기 회사가 아니고 차단기로 예약을 요청을 대신 보내주는 대리자 역할이다. 따라서 외부 시스템에 크게 의존적일 수밖에 없는 서비스다. 플로우는 복잡하지 않는데 간략하게 설명하면 세 단계로 볼 수 있다. 사용자가 앱에서 방문 차량을 예약한다. 메인 서버에서 방문 예약 서버로 요청을 위임한다. 방문 예약 서버는 외부 시스템인 차단기 관제 서버에 예약 내역을 전송한다. 사용..

ERROR!!!!!!! 2022.07.13

Learning SQL 스터디 7,8,9장 정리

Learning SQL 7,8,9장 요약 문자열 데이터 처리 문자열 데이터를 처리할 때는 다음 자료형 중 하나를 사용함. char 고정 길이 문자열. 지정한 크기보다 문자열이 작으면 나머지 공간을 공백으로 채운다. MySQL char는 최대 255자까지 허용한다. varchar 가변 길이 문자열. 최대 65,535자를 허용한다. text 가변 길이 문자열. 최대 4GB 크기 문서를 저장할 수 있다. MySQL에는 tinytext, textm mediumtext, longtext 등이 있다. 문자열 생성 문자열 길이가 최대 크기를 초과할 때 MySQL6.0 이후부터는 strict 모드로 동작하기 때문에 에러가 발생한다. 6.0 이전 버전은 경고만 발생하고 초과되는 문자열은 잘랐다. 다시 이 모드를 사용하려..

카테고리 없음 2022.06.12

TOSS SLASH22 지속 성장 가능한 코드를 만들어가는 방법 요약

TOSS SLASH22 지속 성장 가능한 코드를 만들어가는 방법 요약 패키지 구조, 레이어 구조 얘기도 재밌지만 마지막에 나오는 모듈 구조 이야기가 재밌네요. 멀티 모듈 플젝으로 구성해서 비즈니스 레이어 -> 프레젠테이션 레이어로 역류 참조할 수 없도록 구조적으로 만들고 스프링도 모듈로 격리시켜서 비즈니스 레이어가 있는 모듈에서는 오직 순수한 비즈니스 로직만 있게 만드는 구조는 엄청 나네요 토스페이먼츠가 만드는 소프트웨어에 대한 발표. 토스페이먼츠 팀은 코드 품질에 관심을 지속해서 관심을 가지고 확장 가능한 방식으로 코드를 관리하고 있음. 처음부터 최고의 설계, 최고의 품질을 유지하는 게 아닌, 최소 규칙을 지켜 동작하는 소프트웨어를 빠르게 만든다. 코드 한 줄 한 줄에 왜?라는 질문을 하는 것을 중요하..

카테고리 없음 2022.06.11

LearingSQL #4,5,6

4. 필터링 SQL 문에는 SQL 문으로 수행되는 행 수를 제한하기 위해 하나 이상의 필터조건을 포함하는 `where` 절이 선택적으로 포함된다. 또한 `select` 문에는 그룹화된 데이터의 필터 조건을 포함하는 `having` 절이 포함된다.(103p)조건 평가 where 절은 and 또는 or 연산자로 구분된 하나 이상의 조건을 포함한다. not 연산자는 로 바꿔 사용할 수도 있다. 를 사용하는 것이 이해하는 게 더 쉽다고 설명하는데, 개인적으로는 not 이 더 이해하기 쉽다. 조건 작성 조건은 하나 이상의 연산자와 하나 이상의 표현식으로 구성된다. 표현식은 다음 중 하나일 수 있다. - 숫자 - 테이블 또는 뷰의 열 - Maple Street 과 같은 문자열 - concat 과 같은 내장 함수 -..

Study 2022.06.02

type check는 왜 필요한가?

geeknews 보다가 재밌는 글 발견해서 요약 원글 링크 『프로그래밍 언어 속 타입』 책 소개 | GeekNews 불편하고 딱딱하기만 한 타입 검사는 왜 필요할까? 버그란 프로그램이 의도와 다르게 동작하는 경우를 뜻한다. 그렇다면 버그가 없는 프로그램을 만들어야 할 텐데 그건 불가능하다. 버그를 고치는 것도 어렵지만 찾는 게 더 어려울 때도 있다. 도대체 어디서 이 버그가 발생하는 거지? 찾지 못해서 고치지 못하는 버그도 많다. 그럼 어떻게 하면 버그를 잘 찾을 수 있나? 버그를 이해할 필요가 있다. 버그의 가장 흔한 원인 중 하나는 type error다. 타입 오류가 뭔가? 그걸 알려면 타입이 뭔지 먼저 답해야 한다. 타입은 프로그램에 존재하는 값을 그 종류에 따라 분류한 것이다. 값은 변수에 저장되..

Study 2022.05.18

ConstraintValidator 그리고 유효성 검사에 대한 고민..

스프링에서는 JSR303 기반 애노테이션 기반으로, 일관성 있는 유효성 검증을 진행할 수 있다. @NotNull , @NotEmpty , @Email 등은 검증 가능하지만, 비즈니스 요구사항이 따르는 유효성 검증은 별도로 해야 한다. 예시 차랑 예약 시스템이고 예약 기간에 대한 유효성 검증이 필요하다. 검증 조건은 간략하게 두 가지 정도로 한다. 존재하는 주차장이어야 한다. 퇴차일시가 입차일시보다 앞이면 안 된다. 예약일수가 내부적으로 정해진 최대 예약 일수를 초과해서는 안 된다. 데이터는 아래와 같은 형태로 들어온다. data class 차량예약DTO( var zoneId: Int = 0, //예약할 주차장ID var carNo: String = "", var startDateTime: LocalDat..

Spring 2022.05.16

Spring ArgumentResolver

클라이언트와 통신하다보면 전처리가 필요할 때가 있다. 간단한 예로 session에서 userId를 가져와야 한다고 가정해보겠다. HttpSession에서 UserID를 받아온다. UserID를 UserAuth로 변환해서 서비스 레이어로 넘긴다. @PostMapping("/api/sign-up") public ResponseEntity signUp(@RequestBody SignUpReq signUpReq, HttpSession session) { Long userId = (Long) session.getAttributre("userId"); loginService.signUp(signUpReq, AuthUser.of(userId)); return ResponseEntity.ok().build(); } C..

Spring 2022.05.12

AWS VPC

Amazon Virtual Private Cloud를 이용하면 사용자가 정의한 가상 네트워크로 AWS 리소스를 시작할 수 있다. 이 가상 네트워크는 AWS의 확장 가능한 인프라를 사용한다는 이점 있고, 기존 네트워크와 매우 유사하다. VPC 특징 계정 생성 시 default로 VPC를 만들어 줌. EC2, RDS, S3 등 서비스 활용 가능 서브넷 구성 보안 설정 VPC Peering(VPC 간 연결) IP 대역 지정 가능 VPC는 하나의 Region에만 속할 수 있다. 다른 리전으로 확장 불가능하다. VPC 구성 요소 Availability Zone Subnet(CIDR) Internet Gateway Network Acess Control List/security group Route Table NA..

카테고리 없음 2022.05.11

docker-compose로 mysql 올렸는데 unknown database 에러 발생

docker-compose 파일로 데이터베이스 스키마를 만든 다음, 스프링 애플리케이션을 실행하려고 하니 unknown database라는 메시지가 떴다. 워크벤치로 확인할 때는 정상적으로 접근할 수 있었다. 3306 포트를 조회했을 때 몇 가지 프로세스들이 보여서 3306 포트를 사용하는 것들을 다 kill 해버렸다. 다른 건 다 죽었는데 mysqld는 죽여도 죽여도 다시 살아났다. 그렇게 그냥 토요일 공부를 접었고 일요일이 되었다. 여기서도 마찬가지로 로컬 mysql이 실행 중인지 확인하고 죽인 뒤에 다시 시도하라는 이야기가 나왔다. $mysqladmin shutdown # 3306 포트로 실행 중인 mysql이 죽기는 하지만 바로 다시 살아남 $mysql.server stop # 3306 포트로 실..

ERROR!!!!!!! 2022.05.08

예외처리에 대한 잡설

예외처리에 대해 별 생각 없었다. 문제 생기면 throw 날리고, Advice에서 적절히 변환해서 클라이언트에 전달하면 되는 거 아닌가? 이런 생각은 서비스에 대한 몰이해에서 오는 것 같다. 예외처리는 그렇게 간단하지 않다. 오히려 몹시 까다로운 영역이다. 내가 담당하는 방문차량 예약 서비스에서 자주 발생하는 예외는 이렇다. 사용자가 예약을 신청함. 시스템은 예약이 들어오면 단지의 차단기 서버로 예약 내역을 전송함. 이때 차단기 서버가 죽어있음. 차단기 서버는 우리가 관리할 수 있는 영역이 아니다. 또 우리는 정확히 어떤 이유로 요청이 전송이 안 되는 것인지 알 수도 없다. Connection time out이 발생하면 단지 저쪽 서버에 문제가 생겼다고 추측할 수 있을 뿐이다. 그러면 차단기 서버 관제사..

메모 2022.05.05