본문 바로가기

반응형

spring

(22)
[ssl] aws에 docker와 letsencrypt(certbot) 이용해서 ssl 인증 적용하기 1. ssl를 적용할 수 밖에 없던 과정 수개월째 백수로 지내면서 개인프로젝트를 하고 있다. 개인프로젝트에 ssl을 도입할 수 밖에 없는 이유가 두가지 있었다. 첫째, JWT 기반의 로그인을 하고 있다. JWT는 stateless라는 장점이 있어서 애플리케이션을 확장할 떄 좋지만 보안에 있어서 취약하다. 왜냐하면 사용자 정보가 일부분 들어갈 수도 있고 단순히 해쉬 알고리즘만 안다면 정보를 알 수 있기 때문이다. 그래서 ssl 인증은 필수다. 두번째, 페이스북 로그인 때문이다. 페이스북 로그인을 도입했는데 개발단계에서 localhost를 사용하는 것은 허용되지만 사용에서 https를 사용하지 않는 도메인은 허용하지 않는다. 2. 사전 조사 ssl은 전 회사에서 aws에서 제공해주는 ssl을 이용해서 도입했..
[aws lightsail] AWS 라이트세일에 도커 이용해서 운영 서버 구성 최근 디자이너와 클라이언트 개발자 분들과 협업할 수 있는 기회가 두번 있었다.그때마다 heroku라는 PaaS 서비스(aws의 elastic beanstalk와 비슷한 무료 서비스)의 Free Plan을 사용했었다.그런데 헤로쿠의 문제점이 네가지 정도 있었다.1) 서버의 위치가 미국에 있어서 한국에서 사용하면 성능이 느리다. (데모로 보여주면 눈치 보임..) 2) 30분 동안 서버에 네트워크의 요청이 없을 경우 서버가 멈춘다.(이떄 스케줄링으로 20분에 한번정도 요청을 보내주면 해결되기 한다.)3) 무료로 사용할 시 데이터베이스 연동의 어려움(기본으로 제공해주는 RDB의 용량이 5MB였다.)4) 도커를 써먹을 수 없다. 이건 부차적인 문제이긴하지만 공부한 걸 써먹을 수 있어야... 그래서 평소에 좋다고 ..
[spring] redis로 caching해서 dbms의 부하 줄이기 - 3 한참 관련 로직을 작성하던 중 클래스를 잘못 설계한 벽에 부딪히고 말았다.그리고 토요일 kt 기지국 화재로....모든 의욕을 잃었다.백엔드 프로그래밍에서는 계층마다 dto를 둔다. db에서 데이터를 읽고 쓸때는 entity class를 사용한다.클라이언트와 통신할 때는 entity class를 그대로 노출할 수 없으니 request의 parameter와 response와 mapping해주는 dto를 둔다.그리고 현재 redis를 사용할 경우에는 dto를 하나 더 사용하는 경우가 생길 수 있다.그런데 맨 처음 rdbms를 사용할 때는 redis를 고려하지 않고 dto를 하나만 두고 service 객체에서 하나의 dto 타입만을 반환해줘서 문제가 생겼다. 위와 같이 클라이언트에 보내줄 데이터타입으로 전환하는..
[spring] redis로 caching해서 dbms의 부하 줄이기 - 2 1. 필요한 기능 테스트 코드로 작성 EventCacheService라는 객체를 이용해서 캐싱과 관련된 기능들을 구현한다. 우선 test를 작성해서 필요한 메소드들을 명세해보자 컨텐츠를 조회하는 work flow 1. 사용자는 서버에 컨텐츠 요청(페이징과 검색 조건 있습니다.)2. 검색조건으로 조합한 키로 레디스에 관련 컨텐츠가 캐싱되어 있는지 확인(exist()에 해당)(레디스에 키가 없는 경우) 3. 값이 없는 경우 mariadb에서 입력받은 검색조건으로 모든 컨텐츠 조회하고 redis에 저장(save()에 해당)4. key에 대해서 expire 속성을 넣어준다.(다음 크롤링할 떄 까지로(최소 일주일 가량 될 것)5. 이제 사용자에게 컨텐츠를 리턴해줌(레디스에 키가 있는 경우)3. 레디스에서 해당하는..
[spring] redis로 caching해서 dbms의 부하 줄이기 - 1 평소에 Nosql에 관심이 많았는데. 이번에 퇴사하고 개인프로젝트를 하면서 redis로 caching을 해보기로 결심했다.본래 목적은 캐싱이었는데 사용자의 이벤트 조회 로그를 저장해서 서비스의 메인에 내가 조회한 상품을 노출하는 기능을 먼저 구현하게 되었다. (이것도 차후 글을 올려야겠다.)로그를 기록하고 메인에 노출하는 기능을 구현하면서 레디스가 제공하는 여러 자료형에 대해 이해하고 성능도 테스트해볼 수 있었는데 역시 In-memory db라서 I/O 성능이 꽤 좋다고 느꼈었다.그래서 전격적으로 db의 데이터를 redis로 옮겨서 캐싱을 해보기로 결정했다. 1. 어떤 자료형으로 구현할 것인가? 레디스가 제공하는 자료형은 set, sorted set,hash, list, string으로 네가지가 있다.모..
FirstSpringBoard#6-4] mysql limit 기능을 이용한 페이징 우리는 지난시간 Controller에서 페이징 처리를 했었습니다.편의상 Controller에서 페이징을 했었는데. 이로 인해 생기는 문제점은 무엇일까요?우선 모든 게시글의 목록을 불러오는 문제가 있습니다.지금이야 게시글이 별로 안되지만 점점 게시물이 많아 진다면 DBMS에 부하가 엄청 생기겠죠.모든 사용자가 게시판에서 페이지를 이동할 때 마다 DB에서 모든 게시물 목록을 가져오기 때문이죠.그리고 마지막 페이지에 대한 분기처리와 같이 코드가 길어진다는 단점이 있습니다.이런 문제점을 해결하기 위해서 mysql에서 제공하는 limit 기능을 이용해서 페이징 처리를 해볼게요. 우선 Mapper.xml을 수정해야합니다.getSearchWriterAndContent를 아래와 같이 수정해주세요.order by 뒤에 ..
FirstSpringBoard#6-3] 마지막 페이지에 대한 페이징 처리 안녕하세요.요 며칠은 의욕이 너무 안나서 드라마 정주행하고 공부는 간간히 하면서 지냈습니다.포스팅은 꿈도 못 꿨고요.전에 개발 했던 것을 git 커밋 로그를 보면서 따라가면서 포스팅하는거라 지루한 감도 있습니다.그래도 화이팅해야죠. 저번 시간에 우리가 페이징 처리와 검색 기능을 구현했었습니다.그런데 페이징 처리가 불 완전한데요.마지막 페이지가 제대로 조회되지 않으실겁니다. 그 이유는 마지막 페이지의 특징 때문인데요.마지막 페이지 이전의 모든 게시물들은 게시글을 무조건 정해진 갯수만큼 보여줍니다.그런데 마지막 페이지가 보여주는 게시글을 게시글의 전체 수에 따라서 달라져요. 전체 게시글이 12개이고 한 페이지당 3개씩 보여준다면 마지막 페이지에서도 3개를 보여주니 에러가 나지 않겠죠.그런데 전체 게시글이 1..
FirstSpringBoard#6-1] 페이징 기능 구현하기 안녕하세요. 저번 챕터에서는 간단한 CRUD 기능을 구현했었죠.오늘 추가할 기능은 페이징 기능입니다.우리가 전체 게시글을 조회할 때 모든 게시물을 하나의 화면에 보여주었습니다.이렇게 할 경우 개발하는 우리 입장에서는 아주 편합니다.그러나 사용자 입장에서 가독성은 아주 떨어지죠.웹 애플리케이션에서 페이징 처리는 필수입니다. 우선 저희는 Controller에서 페이징을 처리해 줄 겁니다.일단 구현해 보고 문제점을 찾아야죠. 리팩토링해서 더 효율적인 방향으로 고쳐볼게요. 페이징 처리를 하는데 있어서 고려해야할 사항은 무엇이 있을까요.우선 게시판에서 페이지라는 것이 어떤 기능을 하는지 생각해봅시다.게시판에서 페이지는 게시글을 정해진 숫자로 나눠서 보여주는 기능입니다.그리고 페이지 번호를 클릭하면 해당하는 페이지..

반응형