회고

TIL_210629

코동이 2021. 6. 29. 08:39

1. Facts(사실, 객관)

- 회사 제품 카테고리 관련 DB 짜기

- 회사 어드민 휴면전환 코드 분석

- 품격 백엔드&프런트 연결(로그인)

2. Feelings(느낌, 주관)

- 회사에서 기간 시스템과 홈페이지 업무 2가지를 맡으면서 다양하게 일을 하고 있습니다. 제품 쪽을 인수인계 받으면서 회사에서 제품출시마다 네이밍을 붙이는 코드분류작업을 인수인계 받았습니다. 간단히 SELECT, UPDATE, INSERT를 이용해서 정보를 추가해주었는데, 아무래도 코딩 실력도 중요하지만 어떻게 시스템이 되어있는지 빠르게 분석하고 파악하여 업무에 익숙해지는 것도 중요하다는 생각을 했습니다.

 

- 어드민 관리자가 접속이 30일 이상이 지나면 로그인을 못하게 막도록 하는 작업을 연구중입니다. 일반 회원이 휴면 상태로 돌입하면, 임시 테이블에 따로 저장을 하지만 과연 어드민도 그렇게 관리해야하는지 논의가 필요합니다. 어드민 관련한 다양한 테이블에서 마지막 접속 혹은 가입일로부터 30일이 지났는지 알아내기 위해 서브쿼리를 사용했습니다. 그렇게 쿼리문이 어느 순서로 작동하는지 열심히 분석한 끝에 원하는 칼럼을 추가할 수 있었습니다.

 

- 품격님 백엔드의 SPRING BOOT와 프런트의 VUE를 연동하는 오프라인 모임을 가졌습니다. 먼저 팀원의 CRUD 작업을 도와주었고, NPM을 통해 FRONT를 실행시켜 로그인이 되는지 확인해보았습니다. 로그인을 하면 token을 반환하여 이것을 jwt bearer 토큰에 이용할 예정입니다. api 스펙을 서로 다르게 정의하다보니 연동에 어려움이 있었습니다. 따라서 swagger를 통해 api를 서로 통일 할 예정입니다.

3. Findings (배운 점)

- 쿼리문 실행 순서

 

어드민의 최근 접속일을 알기 위해 다른 테이블과 조인을 하여서 칼럼으로 추가하려고 했습니다. 또한 그 칼럼을 기준으로 오늘의 날짜와 비교하여 비접속 기간을 구해야 했습니다. 최종적으로 비접속 기간을 구하기 위해서 마지막 접속일을 따로 구하는게 선행입니다. 그런데, 제가 원하는 데이터 2개를 모두 SELECT에 쓰면 오류가 납니다.

 

왜냐하면 비접속 기간을 구하기 위해서 필요한 마지막 접속일 칼럼이 SELECT에 처음 등장하기 때문입니다. 결론적으로 이것을 FROM 안에서 데이터를 가지도록 만들어 주어야 했습니다. 이것은 아래에 나온 쿼리문 실행 순서를 보고 알았습니다. 제가 원하는 데이터를 SELECT에서 가공하고 싶으면, FROM에서 미리 가지고 있도록 해야합니다. 저는 단순히 SELECT에서 모든 새로운 칼럼을 조회하고 가공하려고 했기 때문에 나오지 않았습니다.

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

 

아래 쿼리문은 다음의 과정을 가집니다.

SELECT 
	A.*
FROM (
	SELECT 
		ADMIN.*, LOG.LOG_DT, ROUND(SYSDATE - NVL(LOG.LOG_DT, ADMIN.REG_DT),0) AS REST_DAY
	FROM 
		T_ADMIN_MEMBER ADMIN
	LEFT JOIN 
		(SELECT LOG.ADMIN_SEQ, MAX(LOG_DT) AS LOG_DT 
	FROM 
		T_ADMIN_LOG LOG GROUP BY ADMIN_SEQ) LOG
	ON 
		ADMIN.ADMIN_SEQ = LOG.ADMIN_SEQ ) A
	WHERE REST_DAY >= 30
	AND DROP_YN = 'N';

1. T_ADMIN_LOG에서 ADMIN_SEQ를 GROUP BY로 묶고 그중에서 가장 마지막 접속일을 가지도록 가공합니다.

2. 이 테이블을 T_ADMIN_MEMBER와 조인을 시키고 비접속 기간을 구합니다.

3. 마지막으로 새롭게 만들어진 REST_DAY 칼럼을 이용하여 30일 이상 비접속 한 계정들을 조회합니다.

 

 실제로 이 쿼리는 한번에 짠 것이 아니라, 하나씩 짜면서 살을 붙였습니다. FROM 절에 있는 서브쿼리를 먼저 짜고 전체 쿼리문을 짠 것입니다. 제가 WHERE REST_DAY >= 30 할 수 있었던 것은 FROM 안에 서브쿼리에서 미리 정의했기 때문이며, 또한 LOG.LOG_DT를 사용할 수 있었던 것은 조인을 통해서 LOG_DT를 정의해 두었기 때문입니다.

 

즉, FROM이 처음에 시작된다는 것을 항상 주의하여 코드를 짜도록 해야합니다.

 

4. Affirmation (자기 선언)

- 나는, 항상 꼼꼼히 확인하고 기록하며 공부하는 사람이다!!!

 

반응형