[BoostCourse] 프로젝트 6. 예약관리 시스템: 한줄평 등록

 - 다음 글

2020/02/29 - [Edu/BoostCourse Web Project] - [부스트코스] 프로젝트6. 예약관리 시스템: 한줄평 (BE) 제출 [PASS & Feedback]

2020/03/01 - [Edu/BoostCourse Web Project] - [부스트코스] 프로젝트6. 예약관리 시스템: 한줄평 (FE) 제출 [PASS & Feedback]

 - 총 정리

Summery Contents

 

 * 이 글은 웹 프로그래밍 과정을 진행하면서 "개인적인" 생각을 정리한 글입니다.
 * 잘못된 부분, 이해가 안 되는 부분 또는 더 좋은 생각이 있으신 분들은 댓글 남겨주세요.

 

프로젝트 6 기본 기능 다이어그램

 프로젝트 6 기능 구현 후, 다중 파일로 기능 변경

 

프로젝트 6 내용은 아니나 흐름상 필요해보이는 기능 

시연 영상

 

개선해야 할 내용

 - 슬라이드 구현한 내용으로 기능은 작동하나 스크립트 오류 발생

 

[BoostCourse] 프로젝트 5. 예약관리 시스템: 예약하기 (FE)

 

 - 이전 글

 - [부스트코스] 프로젝트 5. 예약관리 시스템: 예약하기 분석 및 설계
 - [부스트코스] 프로젝트 5. 예약관리 시스템: 예약하기(BE) 제출 [PASS & Feedback]

 

피드백

 

정규식 개선 필요
예약 유효성 검사 로직 개선 필요

개선할 사항
 - 공통 API 호출 함수인 getAjax()의 함수명 수정 ->  callAjax()
 - 소스코드 구조 개선 필요 (단일 책임의 원칙:SRP)
 - 의도에 맞는 변수명 개선 (이름 지정 규칙: JavaScript Naming Conventions)
 - 특정 상황에 사용할 수 있는 정규표현식이 아닌 포괄적으로 사용할 수 있도록 하기

 

시연 영상
- 기본적으로 예약하기, 예약확인하기 화면이 영상에 보여야 함.
- 예약하기시 -, + 버튼을 클릭해서 숫자가 변경되는 부분이 영상에 보여야 함.
- 예매자 정보를 입력하고 총매수가 변경되는 것이 영상에 보여야 함.
- 연락처 정보에 숫자와 숫자가 아닌 문자를 입력하는 과정이 영상에 보여야 함.
- 약관의 접기/보기를 클릭해서 변경되는 화면이 영상에 보여야 함.
- 동의버튼을 클릭해서 변경되는 화면이 영상에 보여야함.
- 예약내용을 모두 올바르게 입력해서 '예약하기' 버튼이 선택가능한 상태로 활성화 되는과정이 영상에 보여야함.
- 이메일을 유효하지 않은 정보를 입력해봄.
- 취소를 눌러서 취소된 예약이 그부분이 노출되는지가영상에 보여야 함.

 

[BoostCourse] 프로젝트 5. 예약관리 시스템: 예약하기 (BE)

 

 - 이전 글

 - [부스트코스] 프로젝트 5. 예약관리 시스템: 예약하기 분석 및 설계

 

 

 - 다음 글

 - [부스트코스] 프로젝트5. 예약관리 시스템: 예약하기(FE) 제출 [PASS & Feedback]

 

BE_PJT E-1. 예약관리 시스템: 예약하기

 

 

피드백 요약

 

하단에 작성된 내용은 기능관련 피드백만

1. Service

  • auto seq (key) 기능 사용하기 (ref - link)
SimpleJdbcInsert(docs)

 위 사이트에서 SimpleJdbcInsert라는 내용을 살펴보면

1. SimpleJdbcInsert 클래스 선언

2. setDataSource() 메서드에서 new SimpleJdbcInsert() 클래스 생성

3. withTableName("테이블명").usingGenerateKeyColumns("pk명") chaining 메서드를 통해 필요한 값을 주입

4. AutoGenerated Key 사용할 메서드에서 executeAndReturnKey("파라미터") 메서드를 통해 입력된 값에 대한 Auto-generated Key를 얻을 수 있다.

5. 위 사이트의 예시에서 first_name, last_name을 파라미터로 넣는 이유를 몰랐는데 직접 해보면 테이블에 기본값이 없는 필드는 입력을 해주어야 원하는 key 값을 얻을 수 있다.

 

 위 테이블 보면 product_id, display_info_id, reservation_name, reservation_tel, reservation_email, reservation_date 필드에 "기본값이 없음"을 알 수 있다.

 

ReservationDao.java

 

ReservationDaoTest
ReservationServiceTest.java

위 로그에 132 라는 값을 DB에서 확인

자동증가 132의 값이 리턴되는 것을 알 수 있다.

 


 

현재 프로젝트에 적용되어 있는 클래스는 NamedParameterJdbcTemplate이기 때문에 밑의 내용으로 Generated Key를 구현

 

NamedParameterJdbcTemplate.update 알아보기(docs)

 - update 메서드 중 generatedKeyHolder를 파라미터로 사용하는 메서드가 2개 있다.

 

Issue an update via a prepared statement, binding the given arguments, "returning generated keys".

 

public int update(String sql, SqlParameterSource paramSource, KeyHolder generatedKeyHolder)

NamedParameterJdbcTemplate.update(sql, paramSource, generatedKeyHolder)

 

public int update(String sql, SqlParameterSource paramSource, KeyHolder generatedKeyHolder, String[] keyColumnNames)

NamedParameterJdbcTemplate.update(sql, paramSource, generatedKeyHolder, keyColumnNames)

 

위 update메서드를 통해 리턴받은 generated key

GENERATED_KEY


2. Controller

  • 파라미터의 null이나 공백("") 체크에 대한 조건식 처리
apache에서 제공하는 라이브러리 사용

 

Maven Library

 

참고 사이트

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

 

 

이후 수정한 내용

 - 기존 세션에 대한 로직을 페이지 요청 컨트롤러에서 모두 처리하여 불필요한 코드를 줄여보았다.

[책 읽기]

 블로그 - 기억보다 기록을

 깃허브 - http://bit.ly/fr-springboot

 


 * 이 책에서 개선하려고 한 포인트

* 코드
 - DB에 들어갈 date 필드 처리방식
 - Setter 메서드로 도배된 Entity 클래스들
 - @Autowired로 도배된 Spring DI 코드
 - System.out.println()으로 이루어진 테스트 코드

* 운영 환경
 - 배포된 서버와의 DB연결
 - 배포 서버의 리눅스 기본 설정
 - DB의 여러 설정들
 - 직접 CI/CI 환경을 구축하는 방법
 - 무중단 서비스를 위한 배포 방법
 - Nginx의 설치 및 설정
 - AWS RDS 필수 설정
 - AWS EC2의 Security Group, EIP 등 기본설정
 - Travis CI의 기본 설정

 


  • 따로 알아봐야 할 내용들
    • Eclipse와 intelliJ 중 Java 개발에 더 좋은 것에 대한 의견
    • IntelliJ 사용방법 및 단축키
    • mavenCentral, jcenter
    • 빌드 도구, Gradle, maven 차이점
    • TDD, DDD
    • lombok
    • assertJ
    • ORM, SQL Mapper 구분
    • JPA dirty Checking
    • JPA Auditing, JDK 8 이전의 Date와 Calendar 클래스의 문제점, 그리고 개선된 LocalDate
    • JPA, Hibernate, Spring Data JPA의 관계
    • Spring Data Jpa를 이용하여 관계형 데이터베이스를 객체지향적으로 관리하는 방법
    • 서버 템플릿 엔진과 클라이언트 템플릿 엔진
    • 서버 사이드 렌더링, 클라이언트 사이드 렌더링
    • 템플릿 엔진 종류 및 차이점
    • 스프링 부트 및 모듈 사용 시 기본 폴더 경로
    • CDN

 


 * 정리본

2020/05/27 - [Edu/SpringBoot] - [SpringBoot] IntelliJ에서 SpringBoot시작하기

2020/05/27 - [Edu/SpringBoot] - [SpringBoot] UnitTest 환경 만들기

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] lombok 설정 및 테스트

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] Spring Data JPA 설정

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] 설정파일 yaml로 변경하기

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] Posts API 만들기

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] JPA Auditing

2020/05/28 - [Edu/SpringBoot] - [SpringBoot] Mustache

2020/05/29 - [Edu/SpringBoot] - [SpringBoot] 게시글 등록

2020/05/29 - [Edu/SpringBoot] - [SpringBoot] 게시글 전체 조회

2020/05/29 - [Edu/SpringBoot] - [SpringBoot] 게시글 수정

2020/05/29 - [Edu/SpringBoot] - [SpringBoot] 게시글 삭제

2020/05/31 - [Edu/SpringBoot] - [SpringBoot] Spring Security & OAuth 2.0 로그인

2020/05/31 - [Edu/SpringBoot] - [SpringBoot] OAuth2 Google Login

2020/05/31 - [Edu/SpringBoot] - [SpringBoot] 로그인 & 포스팅 권한 테스트

2020/05/31 - [Edu/SpringBoot] - [SpringBoot] 어노테이션 기반 세션 처리 ArgumentResolver

2020/06/01 - [Edu/SpringBoot] - [SpringBoot] 세션 저장소로 DB이용하기

2020/06/01 - [Edu/SpringBoot] - [SpringBoot] OAuth2 Naver Login

2020/06/02 - [Edu/SpringBoot] - [SpringBoot] 기존 테스트에 시큐리티 적용

 


 

 * 정오표를 통해 책에 의도대로 따라가기

Git 정오표

 

 * 이 책은 JDK 1.8Gradle 4.8을 기준으로 작성되었다는 것을 확인 해야 함

 * 내 프로젝트 생성 시 환경을 맞추고 시작해야 책에서 의도한 대로 따라갈 수 있음

 * 책 대로 했는데 안되면 "나는 이길이 아닌가보다" 라는 생각을 갖게 됨..

 * 서비스 로직 구현할 때 dto -> Service -> Controller 순으로 따라하는게 이해가 쉬움

 

p.71 lombok Issue

intelliJ 설치 시 Gradle 5버전으로 사용되고 있어서 Gradle 4다운드레이드 필요

 

[Gradle 버전 확인하기 gradle-wrapper.properties]

 

Gradle 이슈 대처 방법

 

요약: 현재 프로젝트의 Terminal을 열어 아래 명령어를 복사해서 붙이면 Gradle 다운그레이드할 수 있음

gradlew wrapper --gradle-version 4.10.2

 

p.100 PostsApiController.save() Test Issue

save메서드를 보면 @putMapping(...)라고 되어 있는데 내용을 보면 Post 내용이기 때문에 @PostMapping으로 변경

 

 

 

 

 

p.111 PostsApiController.update() 취소 기능 Issue

PostsUpdateRequestDto 클래스 작성

 

 

 

 

 

Posts 클래스 내에 update() 작성

 

 

 

 

 

p.176 .ignore 파일에 application-oauth.properties 제외 했는데도 commit 할 때 계속 뜨는 경우

application-oauth.properties 파일이 이미 tracked 되고 있는 상태에서
.ignore 파일을 업데이트 할 경우 제대로 적용이 안되고
commit할 때 계속 나오는 경우가 존재한다.
해결책은 캐시를 비워 .ignore 파일이 제대로 적용되도록 한다.

 

 

 

 

 

p.194 권한 변경 후 글 등록 시

1. Application 실행
2. OAuth를 이용하여 구글 로그인 ( h2에 데이터가 들어가는 시점 )
3. h2-console에서 권한 수정 udate usr set rold = "USER"; ( 이때 세션에는 아직 GUEST로 저장되어 있음 )
4. 세션 정보를 최신화 시키기 위해서 로그아웃 후 다시 로그인해서 게시글 등록 시도

 

p.326 Travis CI .travis.yml 설정 후 build 이슈

./gradlew: Permission denied git에 permission을 업데이트 해줘야 travis가 실행할 수 있다.

 

 

 

 

 

.travis.yml에 before_install을 추가하여 permission을 바꾸는 방법

 

 

 

 

 

Git update를 통해 직접 permission을 바꾸는 방법

 

 

 

 

 

p. 338 S3 region 확인

AWS S3 대시보드 -> 생성한 bucket 클릭 -> 속성 -> 정적 웹 사이트 호스팅 클릭 시 엔드 포인트에서 확인 가능

 

p. 394 무중단 배포 테스트 후 게시물 등록 테스트

오류가 당연한 것이 security에서 처음 로그인한 상태가 GUEST이기 때문이다. USER로 변경 해줘야 게시물 등록을 할 수 있다.

 

 


[구현 설계]

  • @GetMapping("/") String index(Model model, @LoginUser SessionUser user)

String index(Model model, @LoginUser SessionUser user)

  • @PostMapping("/api/v1/posts") Long save(PostsSaveRequstDto)

Long save(PostsSaveRequstDto)

  • @GetMapping("/api/v1/posts/{id}") PostsResponseDto findById(Long id)

PostsResponseDto findById(Long id)

  • @PutMapping("/api/v1/posts/{id}") Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto)

Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto)

 

  • @DeleteMapping("/api/v1/posts/{id}") Long delete(@PathVariable Long id)

Long delete(@PathVariable Long id)

 

'' 카테고리의 다른 글

[책] 자바 성능 튜닝 이야기  (0) 2019.07.07

[BoostCourse] 테스트 코드 만들기

 * 더 정리가 필요

이 글은 테스트 코드 없이 손으로 그림그려가면서 코딩하는 부족한 날 위한 글

 

 - 사전내용

바쁘다는 핑계로 프로젝트를 뒤로 미루다가 다시 하려니 생각이 잘 안나고.. 리펙토링 해야 할 부분도 많고, 답도 안나오고...
몇 개월전에 『테스트 주도 개발(Test-Driven Development: By Example)』이란 책을 읽고,
내게 부족한 부분을 채워줄 수 있을 것 같아서 흉내내 보았다.

 

 이 글을 쓰는 시점은 PJT 4까지 완료하고 5개월이 지나고 PJT 5를 다시 시작하려한다.
 - 목표
1. src/test/java 폴더에 class 파일 만들기
2. 테스트 클래스에 Annotation 적용하기
3. @Test Annotation을 적용한 테스트 메서드 만들기
4. Controller에 @Mockito 적용하여 API 테스트 작성

 

 - 기존 테스트 코드

기존에도 소스 내에 print()만 안찍었지 비슷한 수준의 테스트 클래스를 작성하여 흉내만 냈었다.

 

 

 - 카테고리 (/api/categories) 결과 값

 

 

위와 같은 자바 클래스를 Repository, Service까지는 대충 적용 되는 것처럼 보인다.
물론 테스트 코드에 대한 개념과 깊이가 없어 데이터를 출력해보는 것 이상의 정보는 보이지 않는다.

 


 

여기서부터가 문제인데 웹 프로젝트에서 request 값이 정상적으로 요청이 들어와
Service Layer, Repository Layer의 함수를 호출하는 것은

단순하게 함수를 호출하여 결과 값이 내가 만든 결과 값이 나오는지 확인이 가능하다.

Controller도 기존에 만들었던 똑같은 테스트 방식으로 파라미터 넣고 호출하도록 했었다.

 

하지만 Controller의 목적은 Model과 View간에 상호 동작을 관리 하는 것이다.

즉, View에서 request한 값을 받아 Model에 전해주고, Model의 결과 값을 View에 전달해주는 것

 

지금처럼 테스트 하면 View에서 request한 값을 받을 수 있는 방법이 없다.

 

그래서 적용한 것이 Mockito이다.

 

 - dependency 추가

spring-test, junit은 기존에 쓰고 있었고, mockito-all만 새로추가

 

 - Controller 테스트 코드

 

 - Mockito 적용 전 참고해야할 설정

web.xml에 설정되어 있는 servlet 설정

AnnotationConfigWebApplicationContext - DispatcherServlet에게 annotation 기반의 자바 설정 로드
WebMvcContextConfiguration - 자바 베이스 스프링 설정

 

 

 - 상단 어노테이션 설정

@RunWith docs

 - 스프링 테스트를 Junit으로 돌리기 위한 어노테이션 

 

@ContextConfiguration docs

 - ApplicationConfig.class, WebMvcContextConfiguration.class를 spring context의 빈 설정 파일로 사용

 * contextConfigLocation로 사용하고 있는 클래스인 WebMvcContextConfiguration 클래스를 @ContextConfiguration에 추가 안하면 Dispatcher가 URL를 매핑할 controller를 찾지못한다.

 

@WebAppConfiguration docs

 - 테스트할 DI 컨테이너를 웹 어플리케이션 전용 DI 컨테이너로 처리

 

위에 내용이 설정되어야 Test 클래스에서 스프링 MVC 동작을 재현할 수 있다.

 

 - MockMvc 선언

  • MockitoAnnotations.iniMocks()
    • @Mock, @Spy, @Captor, @InjectMocks이설정된 객체를 초기화 해준다.
  • MockMvc
    • MockMvc로 초기화된 DispatcherServlet 인스턴스를 반환한다.
  • MockMvcBuilders.webAppContextSetup(WebApplicationContext context)
    • DisplatcherServlet은 스프링 MVC기반 구조와 응용프로그램 컨트롤러를 찾아 ServletContext로 설정된 Context를 사용하도록 한다.
  • MockMvcBuilders.standaloneSetup(Object... controllers)
    • 하나 이상의 @Controller 인스턴스를 등록하거나 스프링 MVC 인프라를 프로그래밍적인 설정을 통해 MockMvc를 빌드한다.

 

 

 - Mock 객체 선언

  • @Mock
    • 테스트에 필요한 객체를 신속하게 생성할 수 있다.
    • 반복적인 모의 생성 코드를 최소하 하도록 한다.
    • 테스트 클래스를 읽기 쉽게 만든다.
    • 필드 이름이 Mock을 식별하는데 사용되어 확인된 오류를 읽기 쉽게 만들어준다.
  • @InjectMock
    • class의 인스턴스를 생성하고 @Mock(또는 @Spy) Annotation으로 생성된 mock instance를 class의 instance에 주입한다.
    • 이 mock instance를 초기화하고 주입하려 @RunWit(MockitoJunitRunner.class) 또는 MockitoAnnotations.init(this)를 사용해야 한다. 

 

 - 테스트에 필요한 static factory 메서드

static factory 메서드 설명
MockMvcRequestBuilders  요청 데이터를 설정할 때 사용할 static 메서드
MockMvcResultMatchers 
실행 결과를 검증할 때 사용할 static 메서드
MockMvcResultHandlers 
실행 결과를 로그 등으로 출력할 때 사용할 static 메서드

 

 - Mockito로 카테고리 API(get: /api/categories) 테스트 코드

 

 

 - Mockito로 카테고리 API(get: /api/categories) 테스트 결과 값

 

 

 - Mockito로 예약 API(get: /api/reservations) 테스트코드

 

 

 - Mockito로 예약 API(get: /api/reservations) 테스트 결과 값

 

 

 - 데이터 결과 값을 Json Viewer를 통해 데이터 확인

 

참고 사이트

 - MockMvc

 - MockitoAnnotations.init()

 - MockitoAnnotations.initMocks() vs @RunWith(MockitoJunitRunner.class)

 - JsonViewer

 

[shell] -ksh: {파일명.sh}: not found 오류 문제

 

[상황]

 - 윈도우에서 스크립트 작성 후 linux로 옮겨 실행

 

아래와 같이 스크립트 파일 자체를 실행 할 수 없다고 오류 메시지가 출력

-ksh: {파일명.sh}: not found ~~

 

"쉘 스크립트 -ksh not found"로 오류 검색

 

[결론]

 - 윈도우는 텍스트 파일의 끝에서 CR-LF로 줄바꿈을 하고, 유닉스는 LF 문자로 줄바꿈을 한다.

 - 윈도우에서 작성한 쉘 스크립트가 리눅스로 옮겨 실행 시 스크립트 내에 "유닉스 개행문자"와 도스 개행문자"가 섞여 있을 때 문제 발생

 - 모든 문자열 끝에 '^M'이라는 문자는 개행문자가 깨진 흔적

 

[원인 파악 방법]

 

# 오류를 발생하는 파일을 vi 파라미터 -b를 추가하여 실행

vi -b {파일명}.sh

 - 오류가 발생했던 파일을 "vi -b {파일명}.sh"으로 실행하여 확인
(아래와 비슷한 문자열을 확인)

#!/bin/sh^M

function () {^M
    command^M
}^M

 

[원인]

 - 쉘 스크립트 파일 형식이 DOS 형식으로 인하여 CR(carriage return)이 달라서 생기는 경우로 파악

 

[해결책]

 1. vi 에디터에서 DOS 파일 타입을  Unix 파일 타입으로 세팅

# Unix Text로 변환

:set ff=unix

 2. vi에서 각 행의 끝에 있는 ^M 문자를, 모두 공백으로 바꾸기

# 각 행의 끝($)에 있는 ^M문자를 모두(g) 공백(//)으로 변환(%s)

:%s/^M$//g
# ^M쓰는 법

ctrl + v 키 > '^' ctrl + m > 'M'

 

 

'Basic > shell' 카테고리의 다른 글

[Shell] netstat  (0) 2020.02.12
[Shell] rsync  (0) 2019.09.03
[Shell] Exception Handling  (0) 2019.08.12
[Shell] 파일 찾기  (0) 2019.08.12
[shell] value too great for base (error token is "08")  (0) 2019.07.07

[Shell] rsync 사용법

- Rsync는 원격에 있는 파일디렉토리복사하고 동기화 하기 위해서 사용하는 툴

 

Rsync의 기능
 - 원격 시스템으로부터 파일을 효율적으로 복사하거나 동기화 가능
 - Linux, device, 파일의 소유자와 그룹 권한(Permissions)등 파일의 부가정보도 복사 가능
 - scp보다 빠름, rsync는 remote-update 프로토콜을 이용해서 차이가 있는 파일만 복사
(처음에는 모든 파일과 디렉토리를 복사 그 후부터는 차이가 있는 파일만 복사하기 때문에 더 빠르고 효율적)
 - 데이터를 압축해서 송/수신하기 때문에 더 적은 대역폭을 사용

 

Rsync의 동기화 알고리즘
1. 파일 전송 결정
    1) 파일의 크기와 수정시간(modification)을 비교하는 것으로 파일을 전송 할지 말지를 결정
(일반적으로 파일의 내용을 변경하면 크기와 수정시간이 변하지만 항상 그렇다고 단정할 수는 없다는 예외가 있다.)

    2) "--checksum" 의 옵션을 통해 비교 방법을 개선
(크기 / 시간을 이용한 비교 방법보다 안전하지만 더 느리고 더 많은 자원을 사용)

2. 전송할 파일 부분의 결정
    1) 파일을 고정 크기를 가지는 청크(chunk)로 나누어 checksum을 계산

    2) checksum을 서로 계산하여, 다를 경우 해당 부분의 청크만을 복사
(만일 파일의 앞 부분의 정보가 수정되어 정보가 밀릴 경우, 모든 chunk의 checksum이 어긋남)

    3) Rolling hash를 통해 위의 문제를 해결

 

Rsync의 사용법
# rsync [-v] [-q] [-a] [-r] [-b] [-u] [-l] [-p] [-o] [-g] [-D] [-t] [-n] [-e=Command] [–del|–delete] [-z] [–exclude] [–stats] [–progress] Source [[USER@]HOST:]DIST

 

Rsync의 주요 옵션

옵션

설명

-v

verbosity를 높이는 옵션으로 복사하는 과정을 더 자세하게 보여줌

-z

compress를 주는 옵션으로 파일을 복사할 때 압축해서 복사

-h

사람이 읽기 쉬운 형태로 복사 결과물들을 출력

-a 

(same as -riptgoD)

archive 모드로 -riptgoD 옵션을 적용한 것과 같음 (symlink, 권한, timestamp와 같은 속성을 그대로 복사)

-r

디렉토리를 복사 할 때 사용하는 옵션

-l

symlink는 symlink 형태로 복사하는 옵션

-p

파일과 디렉토리들의 권한을 유지하는 옵션

-t

수정시간을 유지하는 옵션

-g

그룹 속성을 유지하는 옵션

-o 소유자 속성을 유지하는 옵션

-D

(same as --devices --specials)

--devices --specials 옵션과 같음

--devices root 권한이 필요하며 Device  관련된 파일들을 복사해서 생성

--specials

name socket이나 fifo와 같은 특수한 파일들도 복사하는 옵션

 

 

Rsync 로컬에서 파일과 디렉토리 복사 및 동기화 

1. 원격 파일 복사 프로그램이지만 로컬 컴퓨터에서 사용도 가능

rsync -zvh {source} {destination}

2. 로컬 컴퓨터에서 디렉토리 복사 및 동기화

rsync -avzh {source} {destination}

 

 

Rsync 서버로부터 파일과 디렉토리를 복사 혹은 동기화

1. 로컬 서버에서 원격 서버로 디렉토리 복사

rsync -avz {domain}@{targetIP}:{targetPath} {localPath}

2. 원격 서버의 디렉토리를 로컬 서버로 복사

rsync -avzc {domain}@{targetIP}:{targetPath} {localPath}

 

Rsync SSH 사용
 - Rsync는 -e 옵션을 이용해서 ssh, rsh와 같은 remote shell 프로그램을 선택 가능
 - -e 옵션이 없다면 ssh 사용 (default)

 

Rsync server 모드
Rsyn 데몬  프로그램 설정
 - "--darmon" 옵션을 이용하여 서버 모드로 작동
 - xinetd를 이용해서 시스템 서비스로 등록

 

[ xinetd 패키지 설치 ]
1. /etc/xinetd.d/rsync 설정 파일 만들기
2. rsync 설정파일은 /etc/rsyncd.conf (설정파일이 없는 경우 직접 만들어야 함)
    1) 복사(동기화) 디렉토리로 /home/share를 선택
    2) 읽기/쓰기 모두 가능 설정
    3) 디렉토리에 대한 소유자는 nobody.nogroup, /home/share 소유자를 nobody.nogroup로 변경
    4) 접속 허용 유저로 user을 추가
    5) auth users에 대한 설정파일은 /etc/rsyncd.secrets에 저장
    * /etc/rsyncd.serets 파일에 접속유저이름과 패스워드를 지정할 수 있다. (패스워드는 plain/text)
3. 읽기 테스트
4. 쓰기 테스트

 

Rsync 데이터 복사 진행 상황 확인
 - "--progesss" 옵션 (진행정도를 화면에 출력)

 

Rsync Include exclude 옵션

1. include

2. exclude

 - 복사할 파일을 제외

# data 디렉토리를 복사에서 제외

rsync -avz --exclude 'data' {domain}@{targetIP}:{targetPath} {localPath}
# (*)를 사용하여 .bak 확장자를 포함하는 파일만 제외

rsync -avz --exclude '*.bak' {domain}@{targetIP}:{targetPath} {localPath}

 

Rsync delete 옵션
# "--delete" 옵션을 사용하여 삭제 후 복사

rsync -avz --delete {domain}@{targetIP}:{targetPath} {localPath}

 

Rsync 전송할 파일의 최대 크기 정하기
# "--max-size" 옵션을 이용해서 전송할 파일의 최대 크기를 정함

rsync -avz --max-size='10k' {doamin}@{targetIP}:{targetPath} {localPath}

 

Rsync 성공적으로 전송 후 원본파일 지우기
#"--remove-source-files"이용하여 전송이 끝난 후 원본 파일 삭제

rsync --remove-source-files -zvh {file} {경로}

 

Rsync Bandwidth 제한 설정
# "--bwlimit" 옵션을 이용하여 파일전송에 사용할 네트워크 대역폭을 제한
# 인터넷 서비스중인 서버에서, 다른 서비스에 영향을 주지 않는 범위내에서 파일 복사를 원할 경우 유용하게 사용

rsync --bwlimit=100 -avzhe ssh {localPath} {domain}@{targetIP}:{targetPath}

 

[참고]

https://www.tecmint.com/rsync-local-remote-file-synchronization-commands/

 

'Basic > shell' 카테고리의 다른 글

[Shell] netstat  (0) 2020.02.12
[Shell] -ksh {파일명}.sh: not found  (0) 2019.09.05
[Shell] Exception Handling  (0) 2019.08.12
[Shell] 파일 찾기  (0) 2019.08.12
[shell] value too great for base (error token is "08")  (0) 2019.07.07

+ Recent posts