Heroku를 사용하여 다세입자 SaaS 초창기 회사 구축 (1부)

7379 단어 architecturestartup
[여러 부분으로 구성된 이 시리즈에서 저는 새로운 응용 프로그램을 Heroku 생태계에서 실행되는 다세입자 체험으로 전환할 것입니다. 본고는 대상 모델, 디자인, 구조와 안전성을 중점적으로 소개합니다.]
내 아내, 니콜은 단야라는 동란 쌍둥이를 가지고 있다.니콜과 단예르는 줄곧 개성을 유지하고 있지만, 그들은 모두 양호한 신체 상태를 유지하고 꾸준히 단련하는 열정을 가지고 있다.사실 다니엘은 라스베이거스 지역의 개인 헬스장에서 다른 사람들을 훈련시키기 위해 헬스 열정을 더욱 강화하기로 했다.Danyel이 창업 과정에서 한 일(즉 허가증, 법률 서류와 보험)을 들었을 때 나는 그녀에게 업무 추적 계획을 물었다.
길게 말하자면 다니엘은 업무 운영에 전념해 왔지만 필요한 기술을 가지고 업무 수요를 충족시키는 데 전념하지 않았다.장모님의 앱을 Amazon Web Services(AWS)에서 Heroku(참조)로 바꾸는 데 성공했기 때문에, 응용 프로그램의 측면에서 Danyel의 업무를 투입하고 도와줄 때가 됐다고 생각합니다.
몇 차례의 화상 통화와 라스베이거스 지역에 대한 신속한 방문을 통해 새로운 헬스 응용 프로그램은 초기 버전에서 다음과 같은 기능을 제공할 것이라고 확신합니다.
  • 고객 관리(그녀의 고객 관리)
  • 운동 관리(고객을 위한 일상 활동 만들기)
  • 세션 관리(고객 한 명 이상을 위한 트레이닝 세션 생성)
  • 미래를 내다보고 이 미래 기능도를 그렸습니다.

    니콜에게 응용 프로그램의 진도를 보여줄 때, 그녀는 무심코 물었다. "내 여동생을 위해 개발한 응용 프로그램에 대해 다른 개인 코치들이 얼마나 더 흥미를 가지고 있는지 알고 싶다."
    니콜의 문제는 나로 하여금 디자인을 바꾸게 했고, 그녀의 누나만이 사용할 수 있는 시스템을 만들었다.Nicole의 논평은 나의 디자인을 Heroku에서 실행되는 간단한 응용 프로그램에서 다세입자 응용 프로그램으로 바꾸었다. 이 응용 프로그램은 위치에 상관없이 여러 명의 헬스 트레이너들이 사용할 수 있다.그때부터 나는 이 응용 프로그램을 고려하여 개인 코치에게 유사한 판매원의 체험을 제공하기 시작했다.
    기술적인 측면에서 볼 때, 나는 내가 얼마나 빠르고 쉬운 속도로 여러 명의 헬스 트레이너들이 사용할 수 있는 SaaS 솔루션을 구축할 수 있는지 보고 싶다.상업적인 측면에서 볼 때 이 해결 방안은 헬스 트레이너로 하여금 그들의 고객, 단련과 과정을 관리할 수 있을 뿐만 아니라 그들의 업무 각 방면의 단일한 참고점이 될 수 있게 할 것이다. 이 모든 것은 비교적 낮은 월 이율로 제공할 것이다.
    Heroku 생태계에서 사용할 수 있는 확장 옵션을 통해 응용 프로그램과 데이터베이스는 필요에 따라 확장할 수 있습니다.구독자의 수입은 추가 Heroku 원가에 자금을 제공하여 나의 개인 투자 원가를 비교적 낮은 수준으로 유지할 것이다.더 중요한 것은 Heroku의 용이성으로 인해 저는 상기 기능표에서 언급한 기능을 계속 구축할 수 있고 인프라 시설 지식과 결정의 수렁에 빠지지 않을 것입니다.
    이 솔루션을 마케팅하려면 어떻게 해야 합니까?확실하지 않아요...나는 너무 흥분해서 나의 생각을 실행에 옮길 수가 없다.
    그러나 이 새로운 디자인 개념이 생겼기 때문에 나는 어떻게 세 가지 일을 하는지 알아야 한다.
  • 하나의 응용 프로그램과 유사한 다중 임차 응용 프로그램을 설계한다
  • 단일 어플리케이션과 달리 보안이 작동하는 방법에 대한 이해
  • 교활한 개발자가 API에 접근하려 해도 데이터 보안을 보호한다
  • 다세입자 응용 프로그램을 설계하다


    위키백과에 따르면 Multitenancy "일종의 소프트웨어 구조를 가리키는데 그 중 하나의 소프트웨어 실례가 한 서버에서 실행되고 여러 명의 세입자에게 서비스를 제공한다."이런 상황에서 나는 여러 명의 헬스 트레이너에게 서비스를 제공할 소프트웨어 실례를 만들고 있다.따라서 모든 헬스 트레이너가 이 시스템을 사용하는 비용은 이들이 자신의 해결 방안을 만들고 위탁 관리하는 비용보다 훨씬 낮을 것이다.
    AWS를 사용한 지 1년이 되는 과정에서 얻은 경험과 교훈, 그리고 AWS에서 Heroku로의 전환 작업, 나의 연구는 나로 하여금 Heroku를 이 응용 프로그램에 사용하도록 인도했다.나는 다세입자가 Heroku에게 도전이 아니라는 것을 안다. 그들이 개발자를 중심으로 하는 방법은 나의 상황에 매우 적합하다.어쨌든, 나는 여전히 전업을 하고 있는데, 집에는 비틀거리며 걸음마를 배우는 아이가 하나 있다.
    Java/Spring 가이드와 Angular 분야의 경험을 고려하여 저는 제가 이해하고 존중하는 기술을 계속 사용하기로 결정했습니다.데이터베이스 측면에서 볼 때 MySQL도 이 응용 프로그램에 적합한 것 같습니다. Heroku에서 실행할 때 ClearDB 옵션을 사용합니다.
    다세입자 디자인을 채택하기 위해서는 모든 세입자(헬스 트레이너)의 데이터(고객, 운동, 회화 등)가 다른 세입자의 영향을 받지 않도록 보호해야 한다.고위층에서 세입자 대상을 만들고 세입자 속성 대상을 포함한다. 이 대상은 세입자에 대한 속성을 제공하고 기능 대상에 연결한다.

    실체적인 측면에서 볼 때, 응용 프로그램을 위한 모든 대상은 임차인 대상에 대한tenantId 인용을 포함할 것이다.Spring Boot을 RESTful API로 사용하기 때문에 클라이언트 객체의 예는 다음과 같습니다.
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    @Entity
    @Table(name = "clients")
    public class Client {
       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       private long id;
    
       @OneToOne
       private Tenant tenant;
    
       private boolean active;
    
       @OneToOne
       private Person person;
    
       @OneToOne
       private Address address;
    }
    
    동일한 모드를 사용하여 초기 버전의 나머지 엔티티를 생성합니다.

    Spring JPA가 데이터베이스 레이어에 필요한 SQL을 만들 수 있다는 것을 알고 이 옵션을 사용해 보기로 했습니다.응용 프로그램을 사용하고 있어도내 속성 파일에 대해 나는 다음 프로그램을 계속 삭제하고 삭제했다.내 리소스 폴더의 속성 파일:
    spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
    spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=fitness.sql
    spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata
    
    다음으로, 나는 스프링 안내 서비스를 시작하여fitness라는 파일에서fitness 데이터베이스에 데이터 정의 언어(DDL) 스크립트를 완전히 채우는 것을 볼 수 있었다.sql.
    Docker, Docker Compose, MySQL base image를 사용하면 몇 분 안에 데이터베이스를 신속하게 시작하고 실행할 수 있습니다.위에서 말한 바와 같이 저는 Heroku에서 ClearDB를 사용할 계획이지만 아직 준비가 되지 않았습니다.Docker를 사용하고 싶지 않고 로컬에서 데이터베이스를 실행하고 싶지 않은 사람들은 Heroku에서 데이터베이스 실례를 만들고 사용할 수 있습니다.원격 실례에 추가할 env 파일입니다.
    이후 나는 신청을 삭제했다.등록 정보 파일을 닫고 RESTful API를 일시적으로 닫습니다.

    보안 공급자 선택


    지난 5년 동안 Okta가 제공한 서비스는 나에게 깊은 인상을 남겼다.여러 프로젝트에서 Okta 도구 모음이 프로젝트의 수요를 충족시키지 못하는 장면을 아직 발견하지 못했다.그러나 이 예에서 나의 다세입자 응용 프로그램의 최종 상태는 Heroku이다.그래서 나는 그들이 추천한 안전 합작 파트너를 이용하고 싶다.
    놀랍게도 Heroku는 실제로 Okta와 협력하여 응용 프로그램의 안전을 개발했다.사실 Heroku 애플리케이션에 Okta를 추가하는 것은 매우 간단합니다. 다음 CLI 명령만 수행하면 됩니다.
    heroku addons:create okta
    
    이 기능은 테스트 단계에 있지만, Heroku 응용 프로그램이 Okta와 통합될 수 있도록 필요한 모든 항목을 자동으로 만듭니다.Click here for more information .

    안전 차단기


    한 세입자가 다른 세입자의 공격을 받지 않도록 보호하기 위해서, 나는 모든 요청의 안전성을 강제하기 위해 Security Interceptor를 도입하고 싶다.이렇게 하면 교활한 사용자가 HTTP 요청 기간에 대상 키를 변경하려고 하면 탐지기가 오류를 던집니다.따라서 모든 비익명 요청은 다음 클래스를 통과합니다.
    public class SecurityInterceptor extends HandlerInterceptorAdapter {
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
         if (SecurityContextHolder.getContext().getAuthentication() != null && SecurityContextHolder.getContext().getAuthentication().getName() != null) {
             try {
                 // Perform the necessary logic
                 processRequest(SecurityContextHolder.getContext().getAuthentication().getName());
                 return true;
             } catch (FitnessException e) {
                 log.error("Error code={}, message={}", e.getCode(), e.getMessage(), e);
                 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                 return false;
             }
         }
    
         log.error("Could not determine requester information");
         response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
         return false;
     }
    }
    
    processRequest() 메서드는 인증에서 필요한 정보를 추출합니다.name 속성 (신분 검증을 거친 Okta 사용자) 을 검색하고 요청한 세입자 기록을 검색합니다.
    요청이 성공하지 못하면 FitnessException을 던져 401 (권한이 부여되지 않은) 오류가 요청자에게 되돌아옵니다.단, 요청이 성공하면 차단기 코드는 요청에 다음 객체를 생성/배치하여 나중에 사용할 수 있도록 합니다.
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class UserData {
       private Tenant tenant;
       private Person person;
    }
    
    이제 요청 라이프 사이클 내에 세입자/개인(즉 응용 프로그램의 사용자)에 대한 참조는 요청의 값이 아닌 모든 HTTP 요청에서 사용됩니다.

    미래를 내다보다


    결론적으로 다음과 같은 설계가 구현되었습니다.
  • 최종 설계 완료
  • 잠정 발표 일정 확정
  • 다세입자 설계 검증
  • 제공된 보증 선택 및 확인
  • 다음 글에서 저는 1.0.0 버전을 위한 다중 임차인 클라이언트와 서버를 어떻게 시작하고 운행하는지 중점적으로 소개할 것입니다. 그 중에서 다음과 같은 구조와 디자인을 포함합니다.
  • Angular 9.1.11(브라우저 클라이언트)
  • Spring Boot 2.3.1(RESTful API)
  • ClearDB/MySQL(데이터베이스)
  • Okta(안전)
  • GitLab(소스 코드 관리 및 CI/CD)
  • Heroku(애플리케이션 호스팅)
  • 즐거운 하루 되세요!

    좋은 웹페이지 즐겨찾기