Email HTML에서 margin 적용하기

Today I learned 날짜 2024년 1월 2일 요일 내용 올해 첫 업무 시작. Email CSS 고객에게 발송할 이메일 양식 HTML 의 CSS를 계속 진행하고 있다. 위아래에 margin이 적용되지 않았다. 구글링 결과, 플랫폼이나 브라우저 마다 Email Template 렌더링이 제각각이라는 말이 많았고 특히 부모의position 을 relative 로 두고 자식을 absolute 로 두었을 때 위치가 적용되는지에 대해 너무 의견이 분분했다. 나는 템플릿을 table로 구성해두었는데, table의 위치에 margin 을 적용하지 않고 빈 셀 하나를 추가해주는 방식으로 구현했다. ...

2024년 1월 2일 · 1 분 · 배준수

CSS로 메일 양식 만들기

Today I learned 날짜 2023년 12월 29일 금요일 내용 어제 막힌 난점은 해결했다. 도커 컨테이너 내에서 스크립트를 실행하니 메일은 발송되었다. 딱히 추가로 건드려야 할 설정이나 변수는 없었다. 기존에는 안되었는데, 로직상 가져온 데이터가 없었기 떄문에 발송되지 않았던 모양이다. 로컬 DB에는 테스트를 위한 적절한 리뷰 데이터가 없기 떄문에, 메일에 담을 데이터들을 임의의 값으로 지정해주었더니 헤결됐다. 수신자를 내 이메일로 설정해서, 어떤 화면이 고객이 보게 되는지 확실히 볼 수 있었다. HTML에 데이터를 담는 것도 금방 해결되었는데, 이미 우리 서비스에 Jinja2 템플릿을 사용하고 있었기 때문이다. 그냥 양식에 맞춰 변수를 집어넣기만 해주었다. 생각지도 못한 부분에서 하루종일 고생했는데, 이메일에 담길 HTML을 로컬에서 열어보았을 떄와 메일로 받아보았을 떄가 다르다. local에선 적용된 padding이 안되있는 경우라던가, 예상 외의 상황이 많다. 이러한 특징은 각 메일 플랫폼별로 모두 다르다고 한다. 고객이 네이버, 구글, 아웃룩 등 받을 곳은 무궁무진한데 출력되는 형식이 매번 달라지니 이메일 만드는게 쉽지 않은 것 같다. 난 그냥 CSS도 못하는데… ...

2023년 12월 29일 · 1 분 · 배준수

별개의 DB 관계 파악

Today I Learned 날짜 2023년 12월 28일 목요일 내용 매 주, shop의 review에 관해 발생한 변화들을 담은 메일을 발송해야 한다. 어제 가진 의문들에 대해 집중적으로 고민한 덕에 많이 진행됐다. 현재 발송하는 shop의 이름 각 메일에는 수신하는 shop에 대한 정보가 담겨야 한다. 그렇다면 그 샵의 정보를 통해 조회하여 담아야 하는데 어떻게 알 수 있을까에 대해 고민됐다. 조금만 고민해보니 정말 쓸데 없는 생각이었다. 모든 shop에 보내야하니 그냥 각 shop에 대해 필요한 정보를 다 가져와야 했다. ...

2023년 12월 28일 · 3 분 · 배준수

2023년 회고록

2023년 회고록 2023년이 일주일 남았다. 크리스마스 분위기가 특별히 체감되지 않기도 하고.. 내게 뜻 깊은 한해라 되돌아보며 회고하는 시간을 가졌다. 꽤 오래 WIL을 쓰면서 회고를 반복해왔고, 근래에는 TIL을 쓰고 있다. 하루를 얼마나 바쁘게, 의미있게 보냈는지를 적나라하게 볼 수 있다. 그리고 시간의 흐름을 지나고나서보면 꽤나 다르게 보인다. 정확히는, 과거의 내가 꽤나 현명하지 못했다는 생각이 많이 든다. 예를 들어, 1번부터 5번까지의 선택지를 두고 치열하게 고민한다. 내 딴에는 열심히 고민했고 최선의 결론을 내렸다고 해도 나중에는 이해가 잘 안된다. “왜 정답인 4번을 냅두고 3번을 생각했을까?”, 혹은 “왜 6번, 7번 선택지는 몰랐을까?”. 심지어는 “그 쓸데없는 걸 왜 고민했을까?“까지도. 나를 되돌아본다는 것은 분명 가치있는 일이다. 꼭 더 나은 모습을 도출해내지 못하더라도 스스로를 더 잘 알게 되는 것만으로도 말이다. ...

2023년 12월 27일 · 5 분 · 배준수

Amazon ECS 알아보기

Today I Learned 날짜 2023년 12월 27일 수요일 내용 Verification Email은 테스트서버에서도 이상이 없었다. 코드가 힘들기 보단 이해가 힘든 Task였음. Review Report Email 주 1회, 한 주간 리뷰의 추가 상황에 대해 메일을 보내줘야 한다. 가장 우선 파악해야할 것은 세 가지였다. 어떻게 정기적으로 메일을 보낼 것인가? 메일 형식은 어디에 어떻게 설정할 것인가? 메일에 데이터를 어떻게 담을 것인가? 우선 반복된 동작은 cron과 cronjob에서 처리한 다는 것은 알고 있었다. 문제는 이 코드를 누가 언제 실행하는지 였는데… 결국 ECS였다. 이에 관한 설명인 밑에서 하고, ECS에서는 특정 이벤트나 시간을 기준으로 Task를 계획할 수 있다. ...

2023년 12월 27일 · 2 분 · 배준수

Email 관련 Task 완료!

Today I Learned 날짜 2023년 12월 26일 내용 지난 주에 정리했던 대로 로직을 완성했다. 기존의 messaging_log를 처리하는 스크립트는 messaging의 비활성화 여부를 체크하지 않기 떄문에, 스크립트를 새로 생성했다. 여기서는 messaging 설정에 따라 messaging_log의 sending_status를 출력하도록 했다. ON 일땐 보내는 로직이 발생하지만 필요한 param이 모두 입력되지 않았기 떄문에 발송 오류가 발생하여 Unable로 설정되야 하고, OFF 일 때는 보내선 안되므로 CHANNEL_OFF 로 설정되야 한다. 로컬에선 문제 없이 작동한다. 회고 노로바이러스 떄문에 너무 힘들다. ...

2023년 12월 26일 · 1 분 · 배준수

좋은 마무리

Today I Learned 날짜 2023년 12월 22일 금요일 내용 어제 막혔던 부분이 술술 해결됐다. 좋은 기분으로 크리스마스를 보낼듯! 구글 SEO 오늘 아침와서 보니 Google Search Console이 우리 서비스의 robots.txt를 인지하기 시작했다. 시간이 답이였나보다. 해당 URL을 올바르게 크롤링할 수 있는지 검사할 수 있는데 Sitemap도 잘 인지하기 시작했다. 아직 sitemap.xml로 인지하는 건 아니고 그냥 크롤링 할 사이트로 인지하고 있긴한데.. 아마 사이트맵 등록도 시간이 조금 지나면 해결되지 않을까 싶다. 바로바로 피드백이 없으니 참 답답하다. 다음주까지 기다려보고 안되면 다시 건드려봐야겠다. ...

2023년 12월 22일 · 3 분 · 배준수

완성한 줄 알았던 것을 진짜 완성하기

Today I Learned 날짜 2023년 12월 21일 목요일 내용 아오 하루종일 되는게 하나도 없다 그냥 또 데모 로그인 테스트서버 까지 확인한 후 실서버로 배포했다. 그런데 실서버에서 또 작동이 안된다… 로딩페이지에서 넘어가지 않는 상황이었다. 콘솔창을 확인해보니 계정 정보는 가져왔지만 그와 연관된 shop을 가져오지 않고 있었다. 해당 계정의 shop이 하나도 없다고 뜨는 상황. 2가지 가설을 세웠다. 설정한 계정의 계정 정보와 shop의 relationship이 DB에서 깨졌다. 실서버에서만 되지 않는 것과 관련하여 로직에 문제가 있다. 1번을 증명하는 방법은, 데모가 아닌 버전으로 로그인 해보면 된다. shop을 못가져오면 당연히 로그인도 안될테니까. 하지만 문제없이 잘 됐다. ...

2023년 12월 21일 · 1 분 · 배준수

데모페이지를 완성했다

Today I Learned 날짜 2023년 12월 20일 수요일 내용 데모 관련 Task 끝 어제 발견했던대로, DB에 commit이 일어나면 object가 refresh되었다. Loading Relationships In the last step, we called [Session.commit()](https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session.commit) which emitted a COMMIT for the transaction, and then per [Session.commit.expire_on_commit](https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session.commit.params.expire_on_commit) expired all objects so that they refresh for the next transaction. SQLAlchemy docs에서 찾은 내용이다. db에 commit하면 현재 session의 object들이 expired되고, object를 새로 로드해야 한다. 로그인할 때, object로 계정 정보로 DB에서 관련된 shop들을 가져오는데, 데모 로그인떄는 데모 스토어로 사용할 shop만 가져오도록 로직을 작성했다. 이 object가 동기화되면서 내가 선택한 shop이 무용지물 되버린건데.. 내가 몰랐던 SQLAlchemy의 기능인 것 같다. ...

2023년 12월 20일 · 1 분 · 배준수

SQL은 어려워

Today I Learned 날짜 2023년 12월 19일 화요일 내용 너무 힘들다. 흑흑 SQL 데모 로그인은 로그인의 로직을 이용해 만들었다. 로그인 함수가 호출되면, 해당 계정 정보가 관계를 갖고 있는 shop들을 불러와 shops 라는 배열에 담는다. 데모 로그인 때는, 가져온 후 데모로 설정한 shop_id와 일치하는 것만 남기도록 처리하였다. 이 과정이 DB에 영향을 끼치지 않도록 하기 위해, DB에 최근 접근 시간을 업데이트하고 commit하는 이후에 해당 로직을 추가하였다. shop들을 가져와 배열에 담는 joinedload에 특정한 조건을 추가하는 코드를 작성해야 했다. 사실 이 부분에서도 많이 헷갈렸는데, joinedload가 일반 join과 다른 점은 eager loading이라느 것이다. 간단히 말하자면 lazy-loading은 레코드를 조회할 때 연관관계가 있는 데이터들의 조회를 필요한 순간까지 미루는 것이고 eager-loading은 레코드를 조회할 때 연관이 있으면 다 가져와놓는 것이다. 지금 고민하는 부분과는 다른 이야기이니 차치하고, join과는 언제 연관된 데이터를 갖고 오느냐만 다르다는 의미이다. ...

2023년 12월 19일 · 2 분 · 배준수