DevOps 모델 정의

아마존은 DevOps 모델을 아래와 같이 정의한다.

DevOps는 애플리케이션과 서비스를 빠른 속도로 제공할 수 있도록 조직의 역량을 향상시키는 문화 철학, 방식 및 도구의 조합입니다.
기존의 소프트웨어 개발 및 인프라 관리 프로세스를 사용하는 조직보다 제품을 더 빠르게 혁신하고 개선할 수 있습니다.

 

 

DevOps의 이점

  1. 속도
    작업 속도가 빨라지므로 더 빠르게 혁신하고, 시장 변화에 더 잘 적응하고, 더 효율적으로 비즈니스 성과를 창출할 수 있다.
    마이크로 서비스CI/CD를 사용하면 팀에서 서비스를 주도적으로 운영하여 업데이트를 더 빠르게 릴리스할 수 있다.

  2. 신속한 제공
    릴리스의 빈도와 속도를 개선하여 제품을 더 빠르게 혁신하고 개선할 수 있습니다.
    CI/CD는 빌드에서 배포까지 소프트웨어 릴리스 프로세스를 자동화한다.

  3. 안정성
    CI/CD 방식을 사용하여 각 변경 사항이 제대로 작동하고 안전한지 테스트한다.
    모니터링과 로깅 방식을 더해 실시간으로 성능에 대한 정보를 얻을 수 있다.

  4. 확장
    규모에 따라 인프라와 개발 프로세스를 운영 및 관리한다. 자동화와 일관성이 지원되므로 위험을 줄이면서 복잡한 시스템을 효율적으로 관리할 수 있다.
    IaC를 사용하면 개발, 테스트 및 프로덕션 환경을 반복 가능하고 더 효율적인 방식으로 관리할 수 있다.

  5. 협업 강화
    개발자와 운영팀은 긴밀하게 협력하고, 많은 책임을 공유하고, 워크플로를 결합한다.

  6. 보안
    자동화된 규정 준수 정책, 세분화된 제어 및 구성 관리 기술을 사용함으로써 보안을 그대로 유지하면서 DevOps 모델을 도입할 수 있다.
    코드형 인프라코드형 정책을 사용하면 규모에 따라 규정 준수를 정의하고 추적할 수 있다.

 

DevOps 모델을 도입하는 방법

DevOps 문화 철학

DevOps로 전환하기 위해서는 문화와 사고방식의 변화가 필요하다.
DevOps는 개발과 운영이라는 두 팀 간의 장벽을 없애주고, 품질 보증팀과 보안팀과도 통합될 수 있다.

DevOps에서는 개발팀과 운영팀이 함께 작업하여 개발자의 생산성과 운영의 안정성을 모두 최적화한다. 

DevOps 모델을 사용하는 조직은 어떻게 구성되어 있든, 전체 개발 및 인프라 수명 주기를 스스로의 책임으로 간주하는 팀들로 구성된다.

 

DevOps 방식 설명

조직이 소프트웨어 개발과 인프라 관리 프로세스의 자동화 및 간소화를 통해 더 빠르게 혁신할 수 있도록 지원하는 몇 가지 주요 방식이 있다.

이러한 방식 대부분은 적절한 도구를 사용해 수행된다.

 

 

DevOps 방식

DevOps 모델을 위한 키워드는 총 5가지이다.

  1. CI/CD (비공식적인 표준처럼 젠킨스가 많이 사용된다.)
    먼저, 지속적 통합은 자동화된 빌드 및 테스트가 수행된 후, 개발자가 코드 변경사항을 중앙 리포지토리에 정기적으로 병합하는 소프트웨어 개발 방식이고,
    지속적 전달은 프로덕션에 릴리스하기 위한 코드 변경이 자동으로 빌드, 테스트 및 준비되는 소프트웨어 개발 방식이다.
    AWS 제품군 - AWS CodePipeline

  2. IaC (코드로 인프라를 생성 및 관리. 이를 위한 도구로는 테라폼이 있다.)
    코드형 인프라는 버전 관리 및 지속적 통합과 같은 기술을 사용하여 인프라를 프로비저닝하고 관리하는 방식이다.
    인프라가 코드를 통해 정의되므로 인프라와 서버를 표준화된 패턴을 사용하여 배포하고, 반복 가능한 방식으로 복제할 수 있다.
    AWS 제품군 - AWS CloudFormation

  3. MSA (마이크로 서비스 아키텍쳐)
    MSA는 단일 애플리케이션을 작은 서비스의 집합으로 구축하는 설계 접근 방식이다. 각 서비스는 자체 프로세스에서 실행되고, 주로 HTTP기반 API를 사용해 다른 서비스와 통신한다. 마이크로 서비스는 비즈니스 기능을 중심으로 구축되며, 각 서비스는 단일 목적으로 한정된다.
    다양한 프레임워크 또는 프로그래밍 언어를 사용하여 마이크로 서비스를 작성하고, 이를 독립적으로 단일 서비스 또는 서비스 그룹으로 배포한다.
    AWS 제품군 - AWS ECS, AWS Lambda

  4. 모니터링 및 로깅
    조직은 지표와 로그를 모니터링하여 애플리케이션 및 인프라 성능이 제품의 최종 사용자 경험에 어떤 영향을 미치는지 확인한다.
    AWS 제품군 - AWS CloudWatch

  5. 커뮤니케이션 및 협업 (Atlassian의 Jira, Trello, Confluence와 같은 도구들이 있다.)
    조직에서 커뮤니케이션과 협업이 증가하는 것도 DevOps의 주요 문화적 측면 중 하나이다.

 

 

 

 

 

참고자료

[1] https://aws.amazon.com/ko/devops/what-is-devops/

 

'DevOps' 카테고리의 다른 글

[DevOps] DevOps란?  (0) 2020.07.03
[DevOps/Infra] Docker에 MySQL 띄우기  (0) 2020.06.24
[DevOps/Infra] 클라우드 서비스 (IaaS, PaaS, SaaS)  (0) 2020.06.21
[DevOps/CI/CD] 깃랩(GitLab)의 CI/CD  (0) 2020.04.07
[DevOps/Infra] AWS CloudFormation  (0) 2020.03.18
[DevOps/CI/CD] Jenkins  (0) 2020.03.03

Map을 순회하는 방법을 정리해보자.

 

첫 번째, Iterator를 통해 접근하기

Map<String, String> map = new HashMap<>();

Iterator<String> keys = map.keySet().iterator();
while (keys.hasNext()) {
    String key = keys.next();
    map.get(key);
}

 

두 번째, entrySet으로 접근하기. Map은 하나의 원소로 Key-Value 묶음을 가지기 때문에 원소란 표현 대신 엔트리라고 표현한다.

Map<String, String> map = new HashMap<>();

for (Map.Entry<String, String> entry : map.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
}

 

세 번째, 두 번째 방법이랑 비슷한데 entrySet이 아니라 keySet을 이용해 접근하기.

Map<String, String> map = new HashMap<>();

for (String key : map.keySet()) {
    map.get(key);
}

 

 

참고자료

[1] https://stove99.tistory.com/96

 

 

'Programming > Java' 카테고리의 다른 글

[Java] Map을 순회하는 방법  (0) 2020.07.03
[Java] 테스트를 위한 환경 구성  (0) 2020.05.28
[Java] Generics  (0) 2020.05.27
[Java/Gradle] Nexus  (0) 2020.05.17
[Java] XML 파싱  (0) 2020.05.13
[Java] JVM ( Java Virture Machine )  (0) 2020.04.19

Docker가 설치되어있다고 가정하고, MySQL 이미지를 다운받아 실행하는 과정을 정리해본다.

 

1. MySQL 이미지 검색

허브에 있는 이미지를 검색해서 공식 이미지를 다운받자.

docker search mysql

 

 

2. MySQL 이미지 다운로드

버전을 명시하지 않으면 가장 최신 버전(latest)을 설치한다.

docker pull mysql:8.0.17

 

 

3. 설치된 Docker 이미지 확인

docker images

 

 

4. MySQL 이미지를 기반으로 MySQL 컨테이너 생성 및 실행

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name seungho-mysql mysql:8.0.17

 

 

위 명령어로 MySQL을 실행한 후, 한글 문제가 발생한다면 위 명령어 뒤에 아래 옵션을 추가한다.

--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

 

 

위와 같은 명령어로 도커 컨테이너를 실행하려고하면 쓰기도 불편하고, 읽기도 불편하다.

대안으로, docker-compose.yml 파일을 생성한 후, 이 파일의 내용을 기반으로 컨테이너를 바로 실행시킬 수 있다.

version: "3" 
services: 
  db: 
    image: mysql:8.0.17 
    container_name: seungho-mysql
    ports:
      - "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    environment: # -e 옵션
      MYSQL_ROOT_PASSWORD: "password"  
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci

 

 

docker-compose.yml 파일에 컨테이너를 어떻게 실행시킬건지 정의한 후 아래 명령어를 통해 실행한다.

docker-compose up

 

 

제대로 실행됬는지 실행 중인 컨테이너 목록을 확인해보자.

docker ps -a

 

 

5. MySQL 컨테이너에 bash 쉘로 접속

docker exec -it seungho-mysql bash

 

 

컨테이너 접속이 성공했다면, 그 다음부터는 일반적으로 터미널에서 mysql 작업하던대로 하면 된다.

MySQL root 계정 패스워드는 위의 docker-compose.yml 파일에서 정의한 MYSQL_ROOT_PASSWORD 값이다.

root@77d4559829a3:/# mysql -u root -p
mysql>

 

 

 

 

 

참고자료

[1] http://jmlim.github.io/docker/2019/07/30/docker-mysql-setup/

 

'DevOps' 카테고리의 다른 글

[DevOps] DevOps란?  (0) 2020.07.03
[DevOps/Infra] Docker에 MySQL 띄우기  (0) 2020.06.24
[DevOps/Infra] 클라우드 서비스 (IaaS, PaaS, SaaS)  (0) 2020.06.21
[DevOps/CI/CD] 깃랩(GitLab)의 CI/CD  (0) 2020.04.07
[DevOps/Infra] AWS CloudFormation  (0) 2020.03.18
[DevOps/CI/CD] Jenkins  (0) 2020.03.03

클라우드 컴퓨팅은 가상화된 IT 리소스를 서비스로 제공하는 것을 말한다.

어떤 대상의 서비스를 제공하느냐에 따라서 종류가 나뉘며, 크게 3가지로 분류된다.

  • IaaS (Infrastructure as a Service)
    인프라를 서비스로 제공하는 것. 흔히 알고있는 AWS EC2와 같은 상품군이 여기에 속한다.

  • Paas (Platform as a Service)
    플랫폼을 서비스로 제공하는 것. 개발을 하기 위한 기반을 다 제공해준다라고보면 된다.

  • SaaS (Software as a Service)
    소프트웨어를 서비스로 제공하는 것. 

 

아래 그림에서 각 클라우드 서비스 모델의 커버리지를 확인할 수 있다.

 

[그림1] 클라우드 서비스 모델

 

 

 

 

 

 

 

 

 

 

 

 

 

참고자료

[1] https://brunch.co.kr/@leedongins/60

 

 

'DevOps' 카테고리의 다른 글

[DevOps] DevOps란?  (0) 2020.07.03
[DevOps/Infra] Docker에 MySQL 띄우기  (0) 2020.06.24
[DevOps/Infra] 클라우드 서비스 (IaaS, PaaS, SaaS)  (0) 2020.06.21
[DevOps/CI/CD] 깃랩(GitLab)의 CI/CD  (0) 2020.04.07
[DevOps/Infra] AWS CloudFormation  (0) 2020.03.18
[DevOps/CI/CD] Jenkins  (0) 2020.03.03

 

 

 

 

 

참고자료

[1] https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-testing

[2] https://meetup.toast.com/posts/124

 

'Web > Spring' 카테고리의 다른 글

[Spring] @SpringBootTest  (0) 2020.06.02
[Spring] @ExceptionHandler와 @ControllerAdcive  (0) 2020.06.02
[Spring/MyBatis] MyBatis-Spring 연동 모듈  (0) 2020.04.07
[Spring] AOP  (0) 2020.03.31
[Spring] Spring WebFlux  (0) 2020.03.03
[Spring Boot] Profile 설정  (0) 2020.02.27

@ExceptionHandler

해당 어노테이션을 사용하면 특정 예외를 잡을 메서드를 정의해줄 수 있다.

코드로 살펴보자. 아래는 일반적인 컨트롤러 구성이다.

@AllArgsConstructor
@RestController
public class DemoController {

    DemoService demoService;

    @PostMapping("/demo")
    public ResponseBase demo(@RequestBody RequestBase request) {
        try {
            return ResponseBase.of(demoService.update(request));
        } catch (Exception e) {
            return ResponseBase.of(null);
        }
    }
}

 

위의 코드를 @ExceptionHandler를 사용하면 아래와 같이 바꿔줄 수 있다.

@AllArgsConstructor
@RestController
public class DemoController {

    DemoService demoService;

    @PostMapping("/demo")
    public ResponseBase demo(@RequestBody RequestBase request) {
        return ResponseBase.of(demoService.update(request));
    }
    
    @ExceptionHandler(Exception.class)
    protected ResponseBase handleException(Exception e) {
        return ResponseBase.of(null);
    }
}

 

컨트롤러에 특정 예외를 던지는 진입 메서드가 많으면 많을수록 코드량을 상당히 줄일 수 있게 된다.

@ExceptionHandler의 특징으로는

  1. Controller, RestController에서만 사용할 수 있다. (Service단에서는 사용 불가능)
  2. 리턴 타입을 자유롭게 지정해줄 수 있다.
  3. 해당 메서드를 정의한 컨트롤러에서만 적용된다. (타 컨트롤러에서는 적용안됨)

 

@ControllerAdvice

Advice는 AOP에서 사용되는 용어인데 컨트롤러를 기준으로 실행 전, 중, 후에 특정 로직을 끼워넣고싶을 때 사용한다.

@ControllerAdvice
public class DemoAdvice {

    @ExceptionHandler(Exception.class)
    public ResponseBase demo() {
        return ResponseBase.of(null);
    }
}

 

 

 

참고자료

[1] https://jeong-pro.tistory.com/195

 

 

'Web > Spring' 카테고리의 다른 글

[Spring] @SpringBootTest  (0) 2020.06.02
[Spring] @ExceptionHandler와 @ControllerAdcive  (0) 2020.06.02
[Spring/MyBatis] MyBatis-Spring 연동 모듈  (0) 2020.04.07
[Spring] AOP  (0) 2020.03.31
[Spring] Spring WebFlux  (0) 2020.03.03
[Spring Boot] Profile 설정  (0) 2020.02.27

웹 애플리케이션을 유지보수하거나 추가 개발하는 과정에서 특정 라이브러리의 기능을 테스트해보고 싶은 경우가 많이 있다.

나 같은 경우 간단하게 StringUtils의 메서드 결과 값이 어떻게 나오는지 테스트해보고 싶었는데, 이런 간단한 작업을 하기 위해 메인 소스 영역에 아래와 같은 코드를 넣은 후, 웹 애플리케이션을 구동하는걸 반복하다보니 이건 아니다 싶었다..

int idx = StringUtils.indexOf("abcdefg_1234", '_');
log.info("result : ", idx);

 

반면에 src/test/java 영역에 해당 코드를 작성하면 결과 값을 가볍게 바로 확인할 수 있다.

public class StringUtilsTest {

    @Test
    public void test() {
        int idx = StringUtils.indexOf("abcdefg_1234", '_');
        System.out.println(idx);
    }
}

 

 

[Preferences] -> [Build, Execution, Deployment] -> [Built Tools] -> [Gradle]로 이동한다.

그런 다음, Run tests using 부분에 Gradle을 IntelliJ IDEA로 변경해주면된다.

 

 

 

 

 

참고자료

[1] http://jmlim.github.io/intellij/2020/03/02/intellij-junit5-display-name-did-not-show-issue/

 

 

 

'Programming > Java' 카테고리의 다른 글

[Java] Map을 순회하는 방법  (0) 2020.07.03
[Java] 테스트를 위한 환경 구성  (0) 2020.05.28
[Java] Generics  (0) 2020.05.27
[Java/Gradle] Nexus  (0) 2020.05.17
[Java] XML 파싱  (0) 2020.05.13
[Java] JVM ( Java Virture Machine )  (0) 2020.04.19

Generics는 타입을 유연하게 설정해주기 위해 사용된다라는 아주 기초적인 내용만 가지고 따로 공부할 필요가 없다 생각했는데,

코드를 보다보니 생각보다 난해한 듯하여 제대로 짚고 넘어가야할 필요가 있다고 느꼈다.

 

Generics와 관련하여 다룰 주제는 다음과 같다.

  • 매개변수화 타입( Parameterized type )
  • 언바운드 와일드카드 타입( Unbounded wildcard type )
  • 바운드 타입 매개변수( Bounded type parameter )
  • 재귀적 타입 바운드( Recursive type bound )
  • 제네릭의 서브타이핑( Subtyping in generics )
  • 와일드카드 서브 타이핑( Wildcard and subtyping )
  • 바운드 와일드카드 타입( Bounded wildcard type )
  • 제네릭 메소드( Generic method )

1. 매개변수화 타입( Parameterized type )

 

 

 

 

참고자료

[1] https://medium.com/@joongwon/java-java%EC%9D%98-generics-604b562530b3

 

 

'Programming > Java' 카테고리의 다른 글

[Java] Map을 순회하는 방법  (0) 2020.07.03
[Java] 테스트를 위한 환경 구성  (0) 2020.05.28
[Java] Generics  (0) 2020.05.27
[Java/Gradle] Nexus  (0) 2020.05.17
[Java] XML 파싱  (0) 2020.05.13
[Java] JVM ( Java Virture Machine )  (0) 2020.04.19

+ Recent posts