- 펌(소프트웨어 개발 수명주기(SDLC)): https://www.servicenow.com/kr/products/devops/what-is-sdlc.html

 

SDLC의 이점

모든 사람이 동의하고 이해할 수 있는 중앙 집중식 사전 목표를 제공함으로써, 리소스 및 관련 비용을 비롯하여 명확한 개발 계획을 세우고, 계발을 올바르게 수행할 수 있도록 역할을 할당할 수 있음

 

소프트웨어 개발 수명주기(SDLC)

1. 현재 문제 식별

2. 계획 수립

who: 프로젝트 리더

what:

- 프로젝트에서 다룰 범위 명확하게 정의

-> 프로젝트가 범위를 넘어서 확장되거나 바뀌지 않도록 프로젝트의 경계를 설정

- 인건비, 재료비 계산

- 프로젝트 조건을 평가하여 목표가 설정된 일정표 구성

- 계획에 이해 관계자, 애플리케이션으로 혜택을 얻는 사람의 피드백 사안도 포함

3. 요구 사항 정의

- 요구사항을 정의 및 문서화 하고 이해 관계자에게 승인을 얻음

* 요구사항: 애플리케이션 목적, 포함할 기능, 해당 과정에서 나타날 수 있는 장애물을 규정

* 필요조건: 리소스를 식별하고 프로젝트에 구축

4. 디자인 및 프로토타이핑

- 애플리케이션이 작동하는 방식, 디자인 요소를 모델링하는 설계 단계

  - UI: 고객이 소프트웨어와 상호작용하는 방식과 소프트웨어가 특정 입력에 응답하는 방식

  - 프로그래밍

  - 보안: 애플리케이션의 보안을 보장하기 위해 실행할 특정 조치. SSL 암호화, 암호 보호 및 안전한 데이터 저장 등

  - 통신: 애플리케이션이 중앙 서버와 같은 다른 자산과 통신하는 방법

  - 아키텍처: 업계 관행, 모든 템플릿, 전체 디자인 및 특정 프로그래밍 언어

  - 플랫폼: 소프트웨어를 호스팅할 플랫폼

- 설계 후 애플리케이션의 인터페이스, 응답 방법, 실행 기능에 대한 기본 아이디어를 보여주기 위한 프로토타입 구축

-> 애플리케이션을 승인하기 위해 이해 관계자로부터 피드백을 받음

5. 소프트웨어 개발

- SDLC 단계

-> 테스트 결과를 기다리거나 코드를 컴파일하는 것과 같이 생산을 지연할 수 있는 소프트웨어 개발 프로세스 문제를 예측, 해결

6. 테스트

- 애플리케이션 부문마다 다른 부문과 문제없이 상호작용하면서 각 기능이 실행되는지 확인

-> 사용자가 애플리케이션을 사용할 때 발생할 수 있는 버그를 줄이고, 사용율을 높이고, 사용자 만족도를 개선

7. 배포

8. 운영 및 유지관리

- 테스트 중에 발생하지 않는 버그를 발견하고 해결

-> 자체 반복 프로세스로 시작할 수도 있음

 

SDLC 방법론

1. Waterfall

- 선형모델, 이전 단계가 완전히 끝날 때까지 다음 단계를 시작할 수 없음.

- 기업이 프로세스 각 단계에 대한 연속성과 실행 가능성을 분석하는데 도움이 되어 병목 현상이나 사일로(부서 이기주의)를 제거하는데 유용

2. Agile

- 사용자 입력과 경험을 핵심적으로 강조

- 피드백에 매우 민감하게 반응하며, 급변하는 시장에 적응하기 위해 더 빠른 주기로 소프트웨어가 출시되도록 운용

3. 반복

- 소프트웨어 초기 버전을 신속하게 구축 후 간단한 반복 과정을 거쳐 개선

- 애플리케이션을 시작하고 실행할 수 있는 대규모 애플리케이션에서 일반적으로 사용되는 접근 방식

-> 비즈니스 요구를 보다 빠르게 충족함

4. DevOps

- Agile과 유사함. 설계 및 구현 단계에서 소프트웨어 사용자로부터 피드백을 수집하여 개발된 애플리케이션의 사용성과 관련성을 개선

- 구성원 팀원 간의 적극적인 공동 작업 및 커뮤니케이션을 활용하여 제품에 관한 모든 측면을 다룸. 개발, 테스트, 보안, 정보 기술 운영 역할을 맡는 담당자가 참여.

5. Spiral

- Waterfall에서와 같이 순차 프로세스로 다른 모델의 반복 접근 방식을 사용

-> 개발 과정에서 프로세스의 각 단계를 반복적으로 거치면서 Spiral 단계마다 점진적으로 출시하고 개선

 

소프트웨어 개발의 Best Practice

1. 소스 통제

- 작업 코드를 보호하기 위해 모든 코드를 단일 위치에 보관.

2. 지속적 통합

- 자산에 속한 각 구성요소가 수명주기 동안 일관성 있게 호환되어야 함

-> 모든 팀원이 유사한 프로그래밍 언어 및 라이브러리를 사용하여 충돌과 중복을 방지

3. SDLC 관리 시스템으로 프로세스 투명성 확보

- SDLC 관리 시스템은 분석, 작업 관리 시스템, 버그 추적으로 각 단계를 제어하고, 효과적으로 실행되지 않는 수명주기 영역을 개선할 수 있음.

 

 

 

 

 

 

 

블로그 이미지

uchacha

개발자 일지

,

- imbedded tomcat 에 jndi 적용

https://jforj.tistory.com/128
1. build.gradle 에

org.apache.commons:commons-dbcp2 dependency 추가

2. resource 설정 클래스 JndiResource 생성

@Configuration
public class JndiResource {
	@Bean
	TomcatServletWebServerFactory tomcatFactory() {
		return new TomcatServletWebServerFactory() {
			@Override
			protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
				tomcat.enableNaming();
				return super.getTomcatWebServer(tomcat);
			}
			
			@Override
			protected void postProcessContext(Context context) {
				context.getNamingResources().addResource(getResource());
			}
		}
	}
	
	public ContextResource getResource() {
		ContextResource resource = new ContextResource();
		resource.setName("jndi/mysql"); // 사용될 jndi 이름
		resource.setType("javax.sql.DataSource");
		resource.setAuth("Container");
		resource.setProperty("factory", "org.apache.commons.dbcp2.BasicDataSourceFactory");
		
		// datasource 정보
		resource.setProperty("driverClassName", "com.mysql.cj.jdbc.Driver");
		resource.setProperty("url", "jdbc:mysql://localhost:3306/test?serverTimezone=UTC");
		resource.setProperty("username", "root");
		resource.setProperty("password", "root");
		return resource;
	}
}

3. applicaion.properties 에
spring.datasource.jndi-name: jndi/mysql

 

- external tomcat 에 jndi 적용

https://pkguma.tistory.com/269
https://solbel.tistory.com/284
0. external war 로 build 하도록 설정

1. application.properties 에
spring.datasource.jndi-name:jndi/mysql

2. tomcat server.xml 에 Resource 추가

<GlobalNamingResources>
	...
	<Resource auth="Container"
		name="jdbc/mysql"
		driverClassName="com.mysql.jdbc.Driver"
		type="javax.sql.DataSource"
		maxActive="8" maxIdle="8" maxWait="-1"
		url="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"
		username="root"
		password="root" />
</GlobalNamingResource>

3. tomcat web.xml에 ResourceLink 추가

<Context>
...
	<WatchedResource>...
	<ResourceLink name="jdbc/mysql"
		global="jdbc/mysql"
		auth="Container"
		type="javax.sql.DataSource" />
</Context>

 

에러 해석

1. 

jndi 는 오타 등으로 Resource 정보가 잘못되었을 때 아래와 같이 DataSourceLookupFailureException 에러를 뱉었다.

jndi Resource 자체가 오타로 제대로 생성되지 않았을 경우에도 LookupFailure Exception을 던져서 해석하기 어려웠다.

[org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/JndiDataSourceAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException: Failed to look up JNDI DataSource with name 'jdbc/mysql'; nested exception is javax.naming.NameNotFoundException: Name [jdbc/mysql] is not bound in this Context. Unable to find [jdbc].

 

@참고(JSP에서 DB연동하기 - JNDI, DBCP 이용): https://all-record.tistory.com/104

블로그 이미지

uchacha

개발자 일지

,

@참고: https://www.manualfactory.net/10147

1. ntp 설치
$yum install ntp

2. 동기화할 서버 주소 세팅
$vi /etc/ntp.conf

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.kr.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst


3. 방화벽 설정
$firewall-cmd --add-service=ntp --permanent

4. 방화벽 다시 로드
$firewall-cmd --reload

5. ntp 서비스 시작
$systemctl start ntpd

6. ntp 서비스 상태 확인

$systemctl status ntpd

7. 시스템 재부팅 후에도 자동시작하도록 세팅
$systemctl enable ntpd

8. 작동 여부 확인
$ntpq -p

9. 동기화된 시간 확인
$date

블로그 이미지

uchacha

개발자 일지

,

- @참고(우아한형제들 기술블로그): https://techblog.woowahan.com/2572/

 

성능테스트, 부하테스트, 스트레스테스트

1. 성능테스트: 실제 트래픽 상황에서의 정상 동작을 테스트한다.

- nGrinder: 성능 측정 목적의 오픈소스 프로젝트. 부하를 줄 수 있는 웹 인터페이스를 제공 및 테스트 결과를 통계로 제공

- pinpoint: Java로 작성된 대규모 분산 시스템의 transaction 추적을 제공하는 APM. 응답/요청 시간그래프

- jstack: JVM의 내장명령도구. Thread 간의 경합으로 발생되는 예기치 않은 현상을 탐지하기 위해 Thread Dump를 분석 ????

- dstat: 시스템의 리소스 자원 사용을 실시간으로 모니터링하기 위해 사용. 리소스 자원을 최대한으로 사용하고 있다는 결론을 얻기 위해. ?????

2. 부하테스트: 이벤트 상황과 같은 순간 트래픽의 최대치를 탐색한다. 리소스 병목을 탐색하고 mysql 설정을 최적화한다.

3. 스트레스테스트: 장기간 부하 발생에 대한 한계치를 탐색한다. 예외 동작 시 자동 복구나 graceful shutdown 동작을 확인하고, 데이터베이스의 failover 시 상황을 테스트한다.

* apm: 어플리케이션 성능관리. application performance management

 

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://gaemi606.tistory.com/entry/Ubuntu2004-LTS%EC%97%90-Java-11-%EC%84%A4%EC%B9%98-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%84%A4%EC%A0%95-Java-8-%EC%84%A4%EC%B9%98

- @참고(readlink): https://nobacking.tistory.com/76

 

1. java 설치

# 1. apt 업데이트
$ sudo apt update

# 2. java 설치
$ sudo apt install openjdk-8-jdk

# 3. java 설치 확인
$ java --version
$ javac --version

 

2. 환경설정

# 1. javac 위치 확인
$ which javac
# /usr/bin/javac

# 2. javac 위치 확인
$ readlink -f /usr/bin/javac
# /usr/lib/jvm/java-8-openjdk-amd64/bin/javac

# 3. environment에 등록
$ sudo vi /etc/enviroment

# >>>> 자바 경로 입력 후 저장
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
# >>>>

# 4. 변경사항 저장 후 확인
$ source /etc/environment
$ echo $JAVA_HOME

 

블로그 이미지

uchacha

개발자 일지

,

- @참고: mangkyu.tistory.com/55

서버 기반 인증의 문제점

1. 세션 저장으로 인한 서버 RAM의 과부하 또는 이를 피하기 위해 사용하는 DB 과부하

2. 서버 확장(Scalability)시 세션 분산 시스템 설계의 복잡성

3. CORS 시 쿠키 본연의 단일 도메인, 서브 도메인에서만 작동하도록 설계되어 있는 구조로 인한 여러 도메인에서 관리가 어려운 점

 

토큰 기반 인증 과정

1. 사용자가 아이디와 비밀번호로 로그인

2. 서버 측에서 해당 정보를 검증

3. 정보가 정확할 시 서버 측에서 사용자에게 signed 토큰 발급

4. 클라이언트 측은 전달받은 토큰을 저장해두고, 서버에 요청 할 때마다 Http 요청 Header에 토큰을 포함

5. 서버는 토큰을 검증하고, 요청에 응답

 

토큰 기반 인증 시스템의 이점

1. 확장성(Extensibility)

 시스템의 확장성을 의미하는 Scalability와 달리 Extensibility는 로그인 정보가 사용되는 분야의 확장을 의미한다.

토큰 기반의 인증 시스템에서는 토큰에 선택적인 권한 부여가 가능하고,

OAuth의 경우 Facebook, Google 등과 같은 소셜 계정을 통해 다른 웹서비스에서도 로그인이 가능하다.

 

블로그 이미지

uchacha

개발자 일지

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

- @참고: hyeonstorage.tistory.com/274

-@참고 : wayhome25.github.io/etc/2017/03/27/vi/

입력모드 전환 명령어

명령어 동작
i 커서 있는데서 입력모드 전환

 

커서의 이동

명령어 동작
ctl + d 반 화면 아래로 이동
ctl + u 반 화면 위로 이동
^ 그 줄의 처음으로 가기
$ 그 줄의 끝으로 가기
gg 문서의 처음으로 가기
G 문서의 끝으로 가기

 

삭제

명령어 동작
dw 커서 오른쪽으로 토큰(특수문자)까지 한 단어 삭제
dd 한 줄 삭제
u 바로 전에 수행한 명령을 취소
ctl + r 취소를 되돌리기

 

복사 & 붙여넣기

명령어 동작
yy 현재 줄을 버퍼로 복사
p 버퍼에 있는 내용을 커서 뒤에 삽입

 

문자열 찾기

명령어 동작
/name name 문자열 찾기
n 다음 name으로 이동
N 이전 name으로 이동
블로그 이미지

uchacha

개발자 일지

,