사내에서 프로젝트를 진행하면서 개발 및 배포를 할 때 현재 사용하는 방법은

강의를 듣거나 책을 읽을 때 나오는 `고대의 방법'인 war파일을 생성하고, was서버의 배포 폴더에 이동 한 뒤 재기동하는 방식을 사용하고 있습니다.

사내 시스템을 효율적으로 개선하고 싶어서 임원분들과 관리자분에게 여러번 요청하였지만 우선순위에 밀려 진행하지 못하다 이번에 여유가 생겨 시스템을 도입하기로 하였습니다.

 

Jenkins 도입에 앞서 Jenkins를 사용하는 목적인 CI/CD가 무엇이고 어떤 장단점이 있는지 정리해보았습니다.

CI/CD란?

CI/CD의 과정들

CI/CD란 소프트웨어 개발에서 지속적인 통합과 배포를 의미하는 용어입니다. CI는 소스 코드 변경이 일어날 때마다 자동으로 빌드, 테스트 등의 작업을 수행하여 팀 내에서 통합된 코드를 유지하고 품질을 유지하는 것을 말하며, CD는 CI를 통해 빌드된 코드를 자동으로 배포하여 최종 사용자에게 제공하는 것을 의미합니다.

CI/CD의 필요성

개발자 생산성 향상

CI/CD를 도입하면 개발자는 빠른 피드백과 자동화된 빌드, 배포 등의 작업을 통해 개발 속도를 높일 수 있습니다. 이는 개발자들이 더욱 집중적으로 개발에만 집중할 수 있도록 돕습니다.

높은 코드 품질

CI/CD를 활용하면 빌드와 테스트 자동화를 통해 오류 발생 가능성을 줄일 수 있습니다. 이는 코드의 품질과 안정성을 높이고, 버그 발생 가능성을 낮출 수 있습니다.

빠른 배포

CI/CD를 도입하면 빠른 속도로 배포를 수행할 수 있습니다. 이는 고객 요구사항이나 시장 상황 변화에 빠르게 대응할 수 있도록 돕습니다. 또한, 빠른 배포는 개발자들이 새로운 기능을 빠르게 출시하여 경쟁 우위를 유지할 수 있도록 돕습니다.

개발 프로세스의 표준화

CI/CD를 도입하면 개발 프로세스를 자동화하고 표준화할 수 있습니다. 이는 프로젝트 참여자들 간의 협업을 더욱 원활하게 할 수 있으며, 코드의 일관성과 품질을 유지할 수 있습니다.

 

Jenkins란

친절해보이는 Jenins 로고

Jenkins는 자동화된 소프트웨어 개발 프로세스를 지원하는 오픈 소스 도구입니다. 이 도구를 사용하면 개발자들이 소스 코드를 지속적으로 빌드, 테스트 및 배포할 수 있으며, 이를 자동화하여 더욱 빠르고 안정적인 소프트웨어 개발 및 배포를 가능하게 합니다.

 

Jenkins는 다양한 플러그인을 지원하며, 이를 통해 빌드, 테스트, 배포, 지속적인 통합 및 배포(CI/CD) 파이프라인 등의 작업을 자동화할 수 있습니다. 이를 통해 개발자들은 자동화된 작업으로 인해 더 많은 시간과 노력을 코드 작성에 집중할 수 있습니다.

 

Jenkins는 Java로 작성되어 있으며, Java 기반의 어플리케이션을 빌드 및 배포하는 것을 지원합니다. 그러나 이 외에도 다양한 언어와 프레임워크를 지원하며, 개발자들은 다양한 플러그인을 통해 커스터마이징할 수 있습니다.

Jenkins는 오픈 소스이므로 무료로 사용이 가능하며, 커뮤니티에서 지속적으로 업데이트 및 개선이 이루어지고 있습니다.

사내 Jenkins 서버 구축 목표

  • 반복적인 작업을 자동화
    • ex) 빌드 → ssh접속 → 배포 및 백업 → 서버 재기동
  • 빌드 환경 표준화
    • 개발자마다 로컬 개발PC 환경이 달라진다면 빌드 결과물이 달라질 수 있음
    • Jenkins : 빌드서버 구축으로 표준화된 빌드 환경 구축

 

참고자료

https://www.redhat.com/ko/topics/devops/what-is-ci-cd

 

CI/CD(CI CD, 지속적 통합/지속적 배포): 개념, 툴, 구축, 차이

CI/CD는 애플리케이션의 통합 및 테스트 단계부터 제공 및 배포까지 애플리케이션 라이프사이클 전체에서 지속적인 자동화와 지속적인 모니터링을 제공하는 것을 뜻합니다.

www.redhat.com

https://ko.wikipedia.org/wiki/%EC%A0%A0%ED%82%A8%EC%8A%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4) 

 

젠킨스 (소프트웨어) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%A0%81_%ED%86%B5%ED%95%A9

 

지속적 통합 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 소프트웨어 공학에서 지속적 통합(continuous integration, CI)은 지속적으로 품질 관리(Quality Control)를 적용하는 프로세스를 실행하는 것이다. - 작은 단위의 작업, 빈

ko.wikipedia.org

 

알고리즘 문제를 풀 때 답을 제출하기 위해서 문자열을 조작할 때 자주 사용하는 클래스가 두가지가 있습니다.

StringBuilder와 BufferedWriter가 있는데, 두가지 모두 유사하게 사용하고 있지만, 자세하게 어떤 차이가 있는지 그리고 어떤 특징과 장단점이 있는지 잘 정리가 안되어서 각각의 특징과 장단점을 알아봅시다.

 

 

StringBuilder와 BufferedWriter는 둘 다 문자열을 처리하는 클래스입니다. 하지만 각각의 특징과 장단점은 다릅니다.

 

StringBuilder

StringBuilder는 문자열을 조작하는 데 사용되며, 내부적으로 가변 문자열 배열을 사용합니다. 문자열 조작은 메모리 내부에서 수행되므로 속도가 빠르며, 문자열을 추가하거나 수정하는 데 용이합니다. 반면에 StringBuilder는 멀티스레드 환경에서 안전하지 않으므로, 동시에 여러 스레드에서 접근하거나 수정하는 것은 권장되지 않습니다.

 

StringBuilder의 장점

  • 문자열 조작이 빠르다.
  • 추가 및 수정이 용이하다.

StringBuilder의 단점

  • 멀티스레드 환경에서 안전하지 않다.
  • 문자열 출력 기능이 없다.

BufferedWriter

BufferedWriter는 출력 스트림에 대한 버퍼를 제공하여 문자열을 출력할 때 I/O 작업 횟수를 줄입니다. 즉, 출력 작업이 매우 빠르게 수행되며, 매번 파일에 접근하지 않고, 한 번에 많은 양의 데이터를 출력할 때 유용합니다. BufferedWriter는 멀티스레드 환경에서 안전합니다.

 

BufferedWriter의 장점

  • 출력 작업이 매우 빠르다.
  • 파일에 접근하지 않고, 한 번에 많은 양의 데이터를 출력할 때 유용하다.

BufferedWriter의 단점

  • 문자열 조작 기능이 없다.

참고 자료

StringBuilder 공식문서: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StringBuilder.html

BufferedWriter 공식문서: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/BufferedWriter.html

 
 
 

'IT > VS' 카테고리의 다른 글

[JavaScript] NPM vs Yarn  (0) 2023.07.14
[Shell] $*과 $@의 차이  (0) 2022.07.30
[ VS]arguments VS parameter  (0) 2021.09.23

자바로 애플리케이션 개발을 할 때 자주 사용하는 Mybatis와 CDATA에 대해 알아봅시다.

MyBatis란?

MyBatis는 SQL Mapper Framework 중 하나로, 자바 객체와 SQL문 사이의 자동 매핑을 지원합니다. 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 간편하게 처리할 수 있도록 도와줍니다.

CDATA 태그란?

CDATA 태그는 XML 문서 안에 특수 문자를 포함시킬 때 사용됩니다. 특수 문자를 그대로 출력하게 해주는 역할을 합니다.

MyBatis에서 CDATA 태그 사용하기

MyBatis에서 SQL문을 작성할 때, 문자열 안에 특수 문자가 포함될 경우 문제가 발생할 수 있습니다. 이런 경우에 CDATA 태그를 사용하여 특수 문자를 그대로 출력할 수 있습니다.

예시

xmlCopy code

<select id="selectUserByName" parameterType="java.lang.String" resultType="User">
	SELECT * FROM users WHERE name = <![CDATA[#{name}]]> 
</select>


CDATA 태그를 사용하면 SQL문 안에서 작은 괄호(<, >)나 & 같은 특수 문자들이 자동으로 이스케이핑되지 않으므로, SQL문 작성 시 편리하게 사용할 수 있습니다.

MyBatis에서 CDATA 태그 사용 시 주의할 점

하지만 CDATA 태그를 사용할 때 주의할 점이 있습니다. 예를 들어, SQL문 안에 ]]> 문자열이 포함된 경우에는 CDATA 태그를 닫는 문자열과 혼동이 발생할 수 있습니다. 이런 경우에는 ]]>]]&gt;와 같이 문자열을 변경해 주어야 합니다.

공식문서

MyBatis 공식문서: https://mybatis.org/mybatis-3/ko/index.html

 

MyBatis – 마이바티스 3 | 소개

마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와

mybatis.org

XML 이스케이핑(MyBatis 공식문서): https://mybatis.org/mybatis-3/sqlmap-xml.html#XML_Escaping

 

mybatis – MyBatis 3 | Mapper XML Files

Mapper XML Files The true power of MyBatis is in the Mapped Statements. This is where the magic happens. For all of their power, the Mapper XML files are relatively simple. Certainly if you were to compare them to the equivalent JDBC code, you would immedi

mybatis.org

참고자료

MyBatis - SQL Mapper Framework: https://github.com/mybatis/mybatis-3

 

GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for Java

MyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.

github.com

CDATA Section (MDN Web Docs): https://developer.mozilla.org/ko/docs/Web/XML/CDATA

 

'IT > JAVA' 카테고리의 다른 글

[Java] Cannot construct instance of `class`  (1) 2023.11.18
[Java]Serializable 직렬화  (0) 2022.06.12

 

 

 

손에 잡히는 10분 정규 표현식 표지

 

http://www.yes24.com/Product/Goods/75454395

 

독서기간 : 2022.08

독서시간 : 2H

평점 : ★★★★★

한줄평 : 텍스트, 문자를 다루는 레벨을 올릴 수 있는 책이다.

 

일을 하다 보면 다양한 곳에서 정규표현식과 만나게 된다.

정규표현식을 볼때마다 항상 든 생각이 언젠가 한번 제대로 정리하여 개발생산성을 높이고 싶다 였는데, 괜찮은 책이 없을까 찾다가 발견하여 보게 되었다.

 

인터넷에서 필요할 때마다 찾아보면 쉬워 보이면서도 직접 쓰려고 하면 정리가 제대로 되지 않아서 활용하기가 쉽지 않은데, 잘 정리된 내용을 하나씩 읽어가면서 체계를 잡을 수 있어서 큰 도움이 되었다.

 

정규식을 공부한 뒤 가끔씩 여러 조건들을 넣어서 필요한 정보만 빠르게 검색하면 정말 뿌듯해진다.

여유가 난다면 꼭 공부하기를 추천한다.

'독서 > IT 기술' 카테고리의 다른 글

[독서/IT 기술] 토미의 Git with 소스트리  (0) 2022.08.07

함께 자라기 책 표지

http://www.yes24.com/Product/Goods/67350256

 

함께 자라기 - YES24

‘함께’는 협력을 말하고, ‘자라기’는 학습을 말한다. 무엇이건 실제 바깥세상(야생)에 임팩트를 남기려면 혼자 힘으로만 되는 게 없다. 함께 해야 한다. 주변 사람들과 함께. 매일 부대끼는

www.yes24.com

독서기간 : 2022.08

독서시간 : 5H

평점 : ★★★★★

한줄평 : 사람들이 함께 일하면서 같이 성장할 수 있는 협업방법에 대해 배울 수 있음

 

크고 복잡한 일들, 더 큰 성과를 내기 위해서는 혼자서 하는 것보다 여러 사람들이 함께 일을 해야 한다.

학교에서도 선생과 학생이 함께 학생의 성장이라는 목표로 협력하며, 회사에서 일을 할 때도 회사의 이익이라는 목표를 위해서 다양한 사람들이 협력하여 일을 한다.

 

일을 더 잘하기 위해서, 더 큰 성과를 내기 위해서는 어떻게 해야할까? 

회사든 학교든 결국 모든 일은 사람들이 하는 것이기 때문에, 사람들이 성장해야 회사도 성장하고 성취할 수 있는 결과도 더 커지게 된다.

 

함께 일을 하면서, 단지 목표만 보고 달려가는 것이 아니라 더 큰 관점에서 조직과 사람이 성장하는 방법에 대한 통찰력을 배울 수 있는 책이었다. 이전까지는 단순히 열심히 일에 집중하고, 부족한 부분은 스스로 찾아서 배우는 개개인의 역량에 의지하는 방식으로 일을 처리하였는데, 더 큰 성과를 내기 위해서는 일을 바라보는 시각이 개인에서 확대하여 같이 일하는 사람들을 바라보고, 그 사람들과 어떻게 협력하고 커뮤니케이션 하여 서로 윈윈할수 있을지 알게 되었다.

 

내가 알게된 내용을 주변 사람들과 함께 공유하고 현실에서 성과로 이뤄내는 것은 또 다른 문제이지만, 같이 일하는 사람들에게 선물해주고 싶은 책이다.

https://school.programmers.co.kr/learn/courses/30/lessons/42577

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

입출력 예제

phone_bookreturn
["119", "97674223", "1195524421"] false
["123","456","789"] true
["12","123","1235","567","88"] false

입출력 예 설명

입출력 예 #1
앞에서 설명한 예와 같습니다.

입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.

 

발상

정렬을 하면 앞뒤 비교만으로 간단하게 해결될 것 같아서 정렬 후 순서대로 하나의 문자열을 그 다음 문자열이 포함하고 잇는지 여부를 검사하는 방식으로 접근하였다.

의사코드

1. 입력값 정렬
2. 배열수+1 만큼 반복{
	1. 다음 배열의 값이 현재 배열의 값을 가지고 있으면 false
}
3. true 리턴

 

코드

더보기
        if (phone_book.length == 1) return true;
        Arrays.sort(phone_book);
        for (int i = 0; i < phone_book.length - 1; i++) {
            String pattern = "^"+phone_book[i]+".*";
            if(phone_book[i+1].matches(pattern)) return false;
//            if(phone_book[i+1].contains(phone_book[i])) return false;
//            if (phone_book[i].length() <= phone_book[i + 1].length() && phone_book[i].equals(phone_book[i + 1].substring(0, phone_book[i].length())))
//                return false;
//            for (int j = i+1; j < phone_book.length; j++) {
//                if (phone_book[j].contains(phone_book[i])) {
//                    return false;
//                }
//            }
        }
        return true;
    }

개선

처음엔 contains로 접근하였는데, 테스트케이스를 통과하지 못하는 예외케이스가 발생하였다.

생각해보니 제시된 문자열로 시작하는 경우만 검사해야 하기 때문에, substring으로 수정하여 통과시켰다가

다시 정규식으로 전환하였는데, 정규식은 패턴문자열을 계속해서 만들어야 하다 보니까 성능이 훨씬 안나왔다.

'IT > Algorithm' 카테고리의 다른 글

[programmers] 기능 개발  (0) 2022.07.27
[programmers] 신고 결과 받기  (0) 2022.07.26
[programmers] 로또의 최고 순위와 최저 순위  (0) 2022.07.17
[programmers] [1차] 비밀지도  (0) 2022.07.17
[Algorithm] RSA 암호  (0) 2022.07.17

+ Recent posts