이전에 spring-boot 로 만들어본 게시판 프로젝트를 웹 서비스로 출시하는 방법도 경험해보고싶어서 이렇게 작성하게되었습니다. 제가 공부한 포스트는 이동욱님의 기억보단 기록을 이라는 블로그에서 공부했습니다.
@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>
private String toStringDateTime(LocalDateTime localDateTime){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return Optional.ofNullable(localDateTime)
.map(formatter::format)
.orElse("");
}
주로 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 - Amazon Web Service
운영 서버는 크게 클라우드 서비스(AWS, Azure 등) 과 호스팅 서비스(Cafe24, 코리아호스팅 등)로 나눠진다.
많은 서비스 기업들이 클라우드 환경으로 이전중
클라우드 서비스
- 서버의 구매, 구축, 운영을 대행한다.
- 웹 호스팅 과 유사하다
- 가상화 기술
- 탄력적인 인프라 운영(접속이 갑자기 늘었을때에 반응)
- 사용한 만큼 과금
기존에 들어오던 트래픽보다 많은 트래픽이 들어온다면 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를 활용하여 묶어진 명령어 조합을 수행하거나 반복적인 명령어를 단일 명령으로 쉽게 사용할 수 있다.