스프링부트로 웹 서비스 출시하기 1일차

박세건·2023년 8월 16일
0

이전에 spring-boot 로 만들어본 게시판 프로젝트를 웹 서비스로 출시하는 방법도 경험해보고싶어서 이렇게 작성하게되었습니다. 제가 공부한 포스트는 이동욱님의 기억보단 기록을 이라는 블로그에서 공부했습니다.

다시 배운 설정 방법

  • 내가 프로젝트를 진행했을때에 만들었던 @Id PK 값은 Long 자료형으로 설정하는 것이 효율적이다.
  • 나는 Entity 객체에 @Data 어노테이션을 사용해서 to_string() 이나 Setter 같은 함수를 계속 사용했는 무분별한 setter는 좋지않다. setter를 사용하고싶다면 그에 맞는 public 함수를 실행시키자
    예를들어서 order.setStatus() 를 사용하고싶다면 order.updateOrder()와 같은 order클래스내에 함수를 만들어주고 사용하자.
  • CreateTime이나 UpdateTime 같은 경우에는 Entity객체에 일일이 작성해주었는데 이건이 아닌 하는 방법을 이용해서 적용시키는 것이 편하고 효율적이다.
@Getter
@MappedSuperclass	//모든 Entity객체가 이 클래스를 상속받게한다.
@EntityListeners(AuditingEntityListener.class)	//BaseTimeEntity클래스에 Auditing 기능을 포함시킵니다.
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
    
}

마지막으로 JPA Auditing 어노테이션들을 모두 활성화 시킬수 있도록 Application 클래스에 활성화 어노테이션 하나를 추가하겠습니다.

@EnableJpaAuditing // JPA Auditing 활성화
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 이전 프로젝트를 진행할때에는 Controller에서 Dto.toEntity를 통해서 바로 전달하는 방법을 사요했었는데 권장하지 않는 방법이었다.
    Controller와 Service 의 역할을 분리하기 위함입니다.
    비지니스 로직과 트랜잭션 관리는 모두 Service에서 관리하고, View 와 연동되는 부분은 Controller에서 담당하도록 구성합니다.

  • @Transactional은 수정, 삭제, 등록 시에 붙이라고만 알고있었지만 무슨 일을 하는지 정확히 알지 못했다.
    메소드 내에서 Exception이 발생하면 해당 메소드에서 이루어진 모든 DB작업을 초기화 시킵니다.
    즉, save 메소드를 통해서 10개를 등록해야하는데 5번째에서 Exception이 발생하면 앞에 저장된 4개까지를 전부 롤백시켜버립니다.
    (정확히 얘기하면, 이미 넣은걸 롤백시키는건 아니며, 모든 처리가 정상적으로 됐을때만 DB에 커밋하며 그렇지 않은 경우엔 커밋하지 않는것입니다.)
    옵션(readOnly = true)을 주면 트랜잭션 범위는 유지하되, 조회 기능만 남겨두어 조회 속도가 개선되기 때문에 특별히 등록/수정/삭제 기능이 없는 메소드에선 사용하시는걸 추천드립니다.

  • css는 Head 부분에 js는 body의 최하단

<!DOCTYPE HTML>
<html>
<head>
    <title>스프링부트 웹서비스</title>
    ...

    <!--부트스트랩 css 추가-->
    <link rel="stylesheet" href="/css/lib/bootstrap.min.css">
</head>
<body>
    ...

    <!--부트스트랩 js, jquery 추가-->
    <script src="/js/lib/jquery.min.js"></script>
    <script src="/js/lib/bootstrap.min.js"></script>
</body>
</html>
  • Entity의 toDto() 와 같은 함수 절대 금지
    DTO는 Entity를 사용해도 되지만, Entity는 DTO에 대해 전혀 모르게 코드를 구성해야합니다.
    Entity는 말 그대로 가장 core한 클래스인 반면, DTO는 View 혹은 외부 요청에 관련 있는 클래스입니다.
    Entity가 DTO를 사용하게 되면, 그때부터 View/외부요청에 따라 DTO뿐만 아니라 Entity까지 변경이 필요하게 됩니다.
    또한, 다른 DTO도 필요하다고 하면 다시 Entity에 toDto2와 같은 메소드가 추가되는데, 모든 변화에 맞춰 Entity 변경이 필요하게 됩니다.
    프로젝트 규모가 커져 프로젝트를 분리해야할때도 Entity가 DTO를 의존하고 있으면 분리하기가 굉장히 어렵기 때문에 DTO가 Entity에 의존하도록 코드를 꼭꼭 작성하시길 바랍니다.
  • 이전에 프로젝트에서는 날짜의 형변환에서 시간을 많이 허비하고 결국 해결하지 못했는데 이동욱님의 포스트를 공부하면서 알게되었다.
    TimeStamp 대신에 LocalDateTime 클래스를 사용하고
    DateTimeFormatter를 사용해서 형변환을 해주고 String 으로 리턴해준다.
  private String toStringDateTime(LocalDateTime localDateTime){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return Optional.ofNullable(localDateTime)
                .map(formatter::format)
                .orElse("");
    }

TEST 방법

주로 Given//When//Then 으로 나눠진다.

  • Given : 환경 구축
  • When : 행위
  • then : 결과 검증
    환경을 만들어주고 어떠한 행위를 했을때에 결과가 올바른지 검증하는 것이다.
    예시 코드
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {

    @Autowired
    PostsRepository postsRepository;

    @After
    public void cleanup() {
        /** 
        이후 테스트 코드에 영향을 끼치지 않기 위해 
        테스트 메소드가 끝날때 마다 respository 전체 비우는 코드
        **/
        postsRepository.deleteAll();
    }

    @Test
    public void 게시글저장_불러오기() {
        //given
        postsRepository.save(Posts.builder()
                .title("테스트 게시글")
                .content("테스트 본문")
                .author("jojoldu@gmail.com")
                .build());

        //when
        List<Posts> postsList = postsRepository.findAll();

        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle(), is("테스트 게시글"));
        assertThat(posts.getContent(), is("테스트 본문"));
    }
}

AWS(클라우드 서비스) 환경 구축

AWS - Amazon Web Service
운영 서버는 크게 클라우드 서비스(AWS, Azure 등) 과 호스팅 서비스(Cafe24, 코리아호스팅 등)로 나눠진다.
많은 서비스 기업들이 클라우드 환경으로 이전중
클라우드 서비스

  • 서버의 구매, 구축, 운영을 대행한다.
  • 웹 호스팅 과 유사하다
  • 가상화 기술
  • 탄력적인 인프라 운영(접속이 갑자기 늘었을때에 반응)
  • 사용한 만큼 과금

AWS가 제공하는 서비스

  • EC2(Elastic compute cloud)
    독립적인 컴퓨터라는 의미로, Linux, Window 운영체제를 제공하고 웹서버, 애플리케이션 서버를 사용할 수 있게 해줍니다.
  • S3(simple storage service)
    파일 서버라고 불리우고 관련 정보들을 저장 할 수 있게해주고 EC2도 파일을 저장 할 수 있지만 S3는 무제한으로 저장이 가능합니다. 스케일을 아마존 인프라가 담당한다는 것이 장점이고
    1바이트 ~ 5테라바이트의 단일 파일을 저장 가능합니다
  • RDS(relational database service)
    관계형 데이터베이스 서비스를 의미하고 MySQL, Oracle,SQL service 를 제공하고 이 서비스또한 백업, 리플리케이션과 같은 작업을 아마존 인프라가 자동으로 제공해줍니다.
  • ELB(Elastic load banlancing)
    유입되면 트래픽을 여러대의 EC2로 분산시켜줍니다. 장애가 발생하면 자동으로 배제시키고 Auto Scaling 기능을 사용해서 EC2를 자동으로 생성 또는 제거 합니다.

AWS 인프라 확장 시나리오

기존에 들어오던 트래픽보다 많은 트래픽이 들어온다면 Scale up을 해줘서 간단하게 처리
더 많은 트래픽이 들어온다면 EC2로만 진행되는 것을 시스템을 분할해서 S3와 RDS로 분할
더 많은 트래픽이 들어온다면 ELB를 사용해서 분할을 시킵니다. Cloud Watch로 사용량을 확인해서 분할을 시키거나 트래픽이 적어적다면 배제까지 진행합니다.

데이터 베이스 확장 시나리오

처음에는 단일 DB서버로 시작합니다.
트래픽이 증가하면 인프라와 마찬가지로 Scale Up을 합니다.
더 많은 트래픽이 들어오면 Master와 Slave로 역할을 나눠서 분할 합니다.
더 많은 트래픽이 들어오면 Shading 이라는 기술로 기능에 따라서 분할합니다.
예를들면 결제기능따로 Master-Slave 배달기능 따로 Master-Slave

이후에 aws회원가입부터 설정 까지는 이동욱님의 블로그를 따라가면서 AWS EC2 & RDS 구축하기를 완료했고 진행하는 중간중간에 모르는 언어나 알아두어야 할 것을 적어 보았다.

EC2 인스턴스 생성 - 완료
EIP 등록 - 완료
EC2 터미널 접속 - 완료
RDS 생성 - 완료
로컬PC에서 RDS 접근 확인 - 완료
EC2에서 RDS에서 접근 확인 - 완료
EC2에 Git 설치 및 프로젝트 Clone - 완료
배포 스크립트 생성(쉘 스크립트 따라하기) - 완료

용어 설명

  • SI (systyem integration) 시스템 구축
    간단히 말하면 전산시스템을 필요로 하는 곳으로부터 요청을 받아서 기획, 개발, 운영 등을 대신해주는 행동을 말합니다.

  • .gitignore
    git에서 관리하지 않는 대상, 프로젝트 생성시에 자동으로 생성되는 것들은 깃에서 따로 관리해줄 필요가 없기때문에 제거해준다.

  • 인프라
    사전적인 의미 : 기초적인 시설과 시스템
    서비스 및 플랫폼을 개발하기 위해 필요한 모든 자원을 관리하는 기반
    기반 시설/설계 라고 할 수 있다.
    IT 인프라는 시스템 구조 및 체계라고 생각한다.
    구성 요소
    - 하드웨어 (HW)
    - 운영체제 (OS)
    - 네트워크 (Network)
    - 미들웨어 (Middleware)

  • NoSQL (not only sql)
    관계형 DB(mysql 등) 에서 특정한 기능을 포기해서 속도를 올린 데이터베이스

  • EIP : AWS의 고정 IP를 Elastic IP 고정 IP를 설정하지않으면 인스턴스를 재시작할때마다 새 IP가 할당되서 도메인 연결을 할수가 없게 됩니다.

  • PuTTY : 서버에 접속하여 명령어를 전송하는 원격 서버 접속 프로그램입니다. 또한 무료 오픈소스 프로그램입니다.

  • IT 마이그레이션 : 데이터나 소프트웨어를 한 시스템에서 다른 시스템으로 이동하는 것입니다.

  • 쉘 : 운영체제상에서 사용자가 입력하는 명령을 읽고 해석하여 대신 실행해주는 프로그램이다. 즉 다시말해서, 운영체제의 커널과 사용자 사이를 이어주는 역할을 하며 사용자의 명령어를 해석하고 운영체제가 알아들을 수 있도록 도와주는 명령어 해석기이다. Linux에서 사용하는 Shell의 종류로는 다음과 같은 것들이 있다.

  • 쉘 스크립트 : 쉘 스크립트란 쉘에서 사용할 수 있는 명령어들의 조합을 모아서 만든 배치(batch)파일이다. 즉, 운영체제의 Shell을 이용하여 한줄씩 순차적으로 읽으면서 명령어들을 실행시켜주는 인터프리터 방식의 프로그램이다. Shell Script를 활용하여 묶어진 명령어 조합을 수행하거나 반복적인 명령어를 단일 명령으로 쉽게 사용할 수 있다.

profile
멋있는 사람 - 일단 하자

0개의 댓글