라벨이 Development인 게시물 표시

EIGRP에 대한 이해: 초보 개발자를 위한 가이드

이미지
EIGRP에 대한 이해: 초보 개발자를 위한 가이드 개요 EIGRP(Enhanced Interior Gateway Routing Protocol)는 시스코에서 개발한 고급 거리 벡터 라우팅 프로토콜입니다. 이 프로토콜은 기존의 거리 벡터 라우팅 프로토콜과 링크 상태 라우팅 프로토콜의 장점을 결합한 하이브리드 형태를 띠고 있습니다. 그렇기 때문에 EIGRP는 다음과 같은 기능적 특징을 가지고 있습니다: 장점 Advanced Distance Vector : 거리 벡터 라우팅의 고급 버전 Fast Convergence : 빠른 수렴 VLSM & CIDR 지원 : 가변 길이 서브넷 마스킹과 클래스 없는 도메인 간 라우팅 지원 다중 네트워크 계층 프로토콜 지원 : IP, IPX, AppleTalk 등 멀티캐스트 및 유니캐스트를 이용한 업데이트 100% 루프 프리 클래스리스 라우팅 동등 및 불균등 부하 분산 지원 단점 시스코 라우터에서만 사용 가능 대규모 네트워크 관리 어려움 네트워크 장애 시 문제 해결 어려움 관련 용어 Neighbor Table : 이웃 테이블, 인접 라우터 목록 관리 Topology Table : 토폴로지 테이블, 다른 EIGRP 이웃 라우터로부터 학습한 모든 경로 관리 Routing Table : 라우팅 테이블, 최상의 경로를 선택하여 저장 Successor & Feasible Successor : 최적 경로상의 이웃과 백업 경로상의 이웃 네트워크 정보 수집 및 경로 생성 과정 EIGRP에서 네트워크 정보를 수집하고 최적의 목적지 경로를 만드는 과정은 다음과 같습니다: EIGRP 이웃 테이블 생성 및 IP 라우팅 테이블 교환 라우팅 테이블 정보 EIGRP 토폴로지 테이블에 저장 최상의 경로 및 다른 적합한 경로 파악 토폴로지 테이블에서 최상의 경로를 라우팅 테이블에 저장 EIGRP 컴포지트 벡터 메트릭 EIGRP는 여러 벡터 메트릭을 결합하여 경로를 계산합니다. 아래는 show ip eigrp topology 명령어를 사용한 예시와

WebClient 사용 예제 코드

HTTP 통신을 하기 위한 라이브러리 입니다. 리액티브 타입의 송/수신을 하여 Non-Blocking 통신을 지원합니다. 필요할 때 편하게 보기 위해 예제 위주로 기록 합니다. WebClinet 기본 설정 적용하여 Bean 으로 등록하는 방법 @Configuration public class WebClientConfig { @Bean public WebClient.Builder webClientBuilder () { return WebClient.builder() .baseUrl( "https://sample.io" ) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); } } GET 요청을 보내는 예시 WebClient webClient = WebClient.create( "https://sample.io" ); Mono<String> result = webClient.get() .uri( "/info" ) .retrieve() .bodyToMono(String.class); result.subscribe(System.out::println); POST 요청을 보내는 예시 WebClient webClient = WebClient.create( "https://sample.io" ); Mono<String> result = webClient.post() .uri( "/info" )

ZSH 히스토리 파일 손상 수정하기 - corrupt history file

ZSH 히스토리 파일 손상 수정하기 ZSH 사용 중 다음과 같은 오류 메시지를 보게 될 수 있습니다. zsh: corrupt history file /home/bs/.zsh_history 이 오류는 ZSH 히스토리 파일이 어떤 이유로든 손상되었을 때 발생합니다. 히스토리 파일은 사용자가 쉘에서 실행한 명령어들을 저장하는데, 비정상적인 종료 또는 파일 시스템의 오류 등으로 인해 손상될 수 있습니다. 오류 수정 방법 문제를 해결하기 위해 다음 명령어를 실행합니다: cd ~ mv .zsh_history .zsh_history_bad strings -eS .zsh_history_bad > .zsh_history fc -R .zsh_history 이러한 과정은 손상된 히스토리 파일을 백업하고, 가능한 한 많은 유효한 명령어들을 복구하여 새 히스토리 파일에 저장합니다. 자동화 스크립트 위 과정을 매번 수동으로 실행하기는 번거롭기 때문에, 다음 스크립트를 작성하여 자동화할 수 있습니다. $PATH 환경 변수에 설정된 경로 중 하나에 스크립트 파일을 생성합니다. 예를 들어, /usr/local/bin 경로에 스크립트를 만들 수 있습니다. sudo vi /usr/local/bin/zsh_history_fix_corrupt 스크립트 파일에 다음 내용을 입력하고 저장합니다: #!/usr/bin/zsh # Fix corrupt zsh history file echo "Attempting to fix corrupt .zsh_history..." if [ -f ~/.zsh_history ]; then mv ~/.zsh_history ~/.zsh_history_bad strings -eS ~/.zsh_history_bad > ~/.zsh_history fc -R ~/.zsh_history echo "Your ZSH history has been recovered. Please veri

객체 지향 설계와 TDD를 통한 효과적인 소프트웨어 개발

이미지
현대 소프트웨어 개발에서 객체 지향 설계(Object-Oriented Design, OOD) 및 리팩토링 은 필수적인 요소입니다. 소프트웨어는 끊임없이 변화하고 성장하는 생명체와 같으며, 이러한 환경에서 효과적인 코드 관리와 유지 보수는 프로젝트의 성패를 좌우합니다. OOD는 코드를 더욱 모듈화하고, 유연하며, 재사용 가능하게 만듭니다. 반면, 리팩토링은 기존의 코드를 개선하여 더욱 깔끔하고 효율적으로 만드는 과정입니다. 하지만 리팩토링은 모든 기능을 다시 테스트해야 하는 어려움이 있습니다. 이때 자동화된 테스트의 역할이 중요해집니다. 자동화된 테스트의 중요성 자동화된 테스트는 리팩토링 과정에서 코드의 안정성을 보장하는 핵심 요소입니다. 이는 코드 변경 시 발생할 수 있는 오류를 빠르게 감지하고, 수정을 쉽게 만들어 줍니다. 특히, Test-Driven Development (TDD) 방법론은 개발 과정에서 테스트를 먼저 작성하고, 이를 기반으로 코드를 개발하는 방식으로 리팩토링을 지원합니다. 이 글에서는 OOD와 리팩토링의 중요성, 자동화된 테스트의 역할, 그리고 TDD의 장단점에 대해 자세히 살펴보겠습니다. 객체 지향 설계 (OOD)의 중요성 모듈성 : OOD는 시스템을 독립적인 객체들로 나눕니다. 이 객체들은 각각의 기능을 가지며 서로 상호작용합니다. 이로 인해 코드의 모듈성이 증가하고, 변경이 필요할 때 특정 부분만 수정하면 되므로 전체 시스템에 미치는 영향을 최소화할 수 있습니다. 재사용성 : 객체 지향 설계는 코드의 재사용을 촉진합니다. 잘 설계된 객체는 다른 프로젝트나 시스템에서도 쉽게 재사용될 수 있습니다. 확장성 : 객체 지향적 접근은 시스템을 확장하기 쉽게 만듭니다. 새로운 기능이 필요할 때, 기존의 객체에 기능을 추가하거나 새로운 객체를 시스템에 통합하기가 용이합니다. 유지보수 용이성 : OOD는 코드의 유지 보수를 용이하게 합니다. 객체 간의 느슨한 결합(loose coupling)은 시스템의 한 부분을

SOLID

SOLID 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙으로 프로그래머가 소스 코드를 읽기 쉽고 확장하기 쉽게 될때까지 소프트웨어 소스 코드를 리팩토링하는 지침이며 애자일 소프트웨어 개발 과 적응적 소프트웨어 개발의 전반적 전략의 일부이다. S(SRP-Single responsibility principle) - 한 클래스는 하나의 책임만 가져야 한다. O(OCP-Open/closed principle) - 확장에는 열려 있으나 변경에는 닫혀야 한다. L(LSP-Liskov substitution principle) - 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.(계약에 의한 설계 참고) I(ISP-Interface segregation principle) - 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다. D(DIP-Dependency inversion principle) - 추상화에 의존해야하며 구체화에 의존하면 안된다. 의존성 주입 은 이 원칙을 따르는 방법 중 하나이다.

Java-String, StringBuffer

1. 둘다 문자 배열(char[]) 2. 배열의 크기를 늘리려면 새로운 배열을 생성해야함 3. String은 문자열 결합이 일어날때마다 항상 새로운 배열을 만들고 복사하는 과정을 거침 4. 3번의 과정은 여유 크기의 배열(StringBuffer)의 내용을 변경하는 것과 성능 차이가 있음 5. 너무 여유있게 생성하면 메모리 낭비(StringBuffer의 단점) 6. 5번을 생각하여 너무 작게 잡으면 의미 없음(그래도 String보다는 나음) 7. StringBuffer가 더 빠름.(이유 : 3번 배열의 특징) 8. String + 연산을 컴파일러가 StringBuffer로 변환함 9. 8번 컴파일러의 변환에는 한계가 있음 10. 결론은 왠만하면 String 사용(자동 변환되니까…)하고 성능상 문제가 되는 경우에 StringBuffer를 이용하여 최적화해야함 참고 - 네이버 자바초보스터디 카페

Java-Vector, ArrayList, Object[], HashMap, TreeMap의 비교 선택

1. 성능의 관점이되는 3가지 - 저장시간(insert time) - 검색시간(seek time) - 읽는시간(read time) ** 각 컬렉션 클래스들은 위의 3가지에 대해 장단점이 있음 2. Hash계열(Hashtable, HashMap)이 검색이 제일 빠른대신 저장시간이 오래걸림.(전화번호부, 주소록 같이 검색이 주로 되는 곳에 유리) 3. TreeMap과 같은 Sorted계열은 저장시간은 Hash계열보다 빠르고, 검색시간은 Hash계열보다 느림(균형잡힌 성능) TreeMap은 정렬된 상태로 데이터를 저장하기 때문에, 범위검색(Range Search)기능 제공함 4. 검색없이 데이터를 저장/읽기 하는 경우 Vector와 ArrayList를 사용(ArrayList가 조금 빠름) 5. 최적화가 필요하면 Object배열을 구현(4번의 2개도 최적화는 잘되어 있음) 6. 구현하려는 기능의 동기화, 저장시간, 검색시간을 잘 고려하여 선택하여야 함 참고 - 네이버 자바초보스터디 카페

Java-Inner Class

종류 특징 instance class 1. 외부 클래스의 멤버변수 선언위치에 선언 2. 외부 클래스의 인스턴스멤버처럼 다루어짐 3. 주로 외부 클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언 static class 1. 외부 클래스의 멤버변수 선언위치에 선언 2. 외부 클래스의 static멤버처럼 사용됨 3. 주로 외부 클래스의 static멤버, static 메서드에서 사용될 목적으로 선언 local class 1. 외부 클래스의 메서드나 초기화블럭 안에 선언 2. 선언된 영역 내부에서만 사용 anonymous class 1. 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스 // 외부 클래스 class Outer { // 내부 클래스 class Inner { int iv = 100; } // 스태틱 내부 클래스 static class StaticInner { int iv = 200; } // 외부 클래스의 멤버변수 int value = 10; // 내부 클래스2 class Inner2 { // 내부 클래스2 멤버변수 int value = 20; // 내부 클래스2 함수 void method1() { // 함수의 지역변수 int value = 30; System.out.println(value); System.out.println(this.value); System.out.println(Outer.this.value); } } } public class ExampleInnerClass {

Java Project의 ClassPath에 log4j.properties 추가

src 폴더 아래에 넣어두면 classpath에 추가된다.

이클립스 오류 - 프로젝트 폴더가 열리지 않는 경우

이미지
Eclipse에서 프로젝트가 사라졌을 때 해결 방법 프로젝트 설명 파일 (.project)이 없어진 경우의 해결 방법 이 글에서는 Eclipse IDE 사용 중 발생할 수 있는 프로젝트 관련 오류를 해결하는 방법을 소개합니다. 특히 Maven을 비활성화한 후 다시 설정하려 할 때 자주 발생하는 문제에 초점을 맞춥니다. 문제 상황 Eclipse에서 Maven을 비활성화(maven disable)한 후 다시 설정(convert)하려 할 때, 예상치 못한 오류로 인해 프로젝트가 열리지 않는 경우가 있습니다. 이 글에서는 그러한 상황을 해결하는 간단하면서도 효과적인 방법을 제공합니다. 다른 방법들도 있지만 아래의 방법이 가장 쉬운 것으로 보여져서 정리 합니다. 해결 방법 1단계: Eclipse 종료 먼저 Eclipse를 완전히 종료합니다. 이는 모든 세션을 정리하고 파일을 안전하게 닫는 데 도움이 됩니다. 2단계: .metadata 폴더로 이동 Eclipse가 설치된 workspace의 .metadata/.plugins 폴더로 이동합니다. (문제가 있는 workspace) 3단계: org.eclipse.core.resources 폴더 삭제 org.eclipse.core.resources 폴더를 찾아 삭제합니다. 만약 데이터 손실에 대해 우려된다면 폴더를 백업하고 나서 삭제하십시오. (압축 한 뒤 백업 후 삭제 합니다.) 4단계: Eclipse 재시작 변경 사항을 적용하기 위해 Eclipse를 다시 시작합니다. 5단계: 프로젝트 임포트 Eclipse에서 File > Import 를 선택합니다. 그 후, General > Existing Projects into Workspace 옵션을 선택합니다. (검색창에서 'ex'로 검색해도 나옵니다.) 6단계: Workspace 지정 Select root directory 에서 Browse.. 를 클릭하고, 원하는 workspace를 지정한 후 프로

Eclipse IDE 개인 설정 가이드

이미지
Eclipse IDE 개인 설정 가이드 Eclipse IDE를 더 효율적으로 사용하기 위한 여러 설정을 소개합니다. 이 가이드를 따라하면 개발 환경을 개선하고 생산성을 높일 수 있습니다. 세로 블럭 선택 단축키 변경하기 설정 경로 : Window > Preferences > General > Editors > Keys | Toggle Block Selection 변경사항 : 단축키를 Alt + C 로 변경 (기존에 Alt + C 에 할당된 커맨드는 제거) 워크스페이스 인코딩 변경하기 설정 경로 : Window > Preferences > General > Workspace | Text file encoding 변경사항 : 인코딩을 UTF-8 로 선택 이클립스 시작 이미지 변경하기 파일 경로 : eclipse/plugins/org.eclipse.platform_4.3.1.v20130911-1000/splash.bmp 폰트 변경하기 설정 경로 : Window > Preferences > General > Appearance > Colors and Fonts | Basic > Text Font 변경사항 : 글꼴을 Courier New 로 선택 이클립스 힙 상태 표시하기 설정 경로 : Window > Preferences > General 변경사항 : Show heap status 옵션 체크 Undo 히스토리 설정하기 설정 경로 : Window > Preferences > General > Editors > Text Editors 변경사항 : Undo history size 를 2000 으로 설정 소스 코드 라인 번호 표시하기 설정 경로 : Window > Preferences > General > Editors > Text Editors 변경사항 : Show line numbers 옵션

Eclipse, Maven, Spring, Tomcat

개발 환경 설정 필요한 도구 다운로드 Eclipse : 구글에서 'eclipse' 검색 후 다운로드 Tomcat : 구글에서 'tomcat' 검색 후 다운로드 Java : 'Java Oracle' 검색 후 다운로드 Maven : 'Maven' 검색 후 다운로드 Eclipse 플러그인 설치 상단 메뉴의 Help > Eclipse Marketplace 에서 원하는 플러그인 검색하여 설치 이미 설치된 경우 update , uninstall 버튼이 나옴 주요 플러그인 Spring : Eclipse Marketplace에서 STS 로 검색 후 Spring Tool Suite for Eclipse 설치 버전은 Help > About Eclipse 참고 Maven : Eclipse Marketplace에서 Maven Integration for Eclipse 로 검색 후 설치 Maven 설정 Window > Preferences > Maven > Installations > Add Installation home 의 Directory... 클릭 후 다운로드 받은 Maven 폴더 설정 Maven > User Settings > Global Settings(User Settings) 의 Browse.. 클릭 후 다운로드 받은 Maven 폴더 안의 Conf/settings.xml 설정 추가 설정 Global Setting : Maven 폴더의 conf/settings.xml (모든 사용자에게 적용) User Settings : USER_HOME/.m2/settings.xml (특정 사용자에게 적용) localRepository 변경 : User Settings의 settings.xml localRepository 태그 값 수정 Spring 프로젝트 생성 및 톰캣 연동 Pro

OWASP Top10(2013)

A1- 인젝션 : 인젝션이란 웹사이트에 조작된 값을 전송하여 DB 의 데이터를 손실 시키거나 삭제 , 수정 등의 악영향을 미치는 행위를 말한다 . 이러한 결함은 소스코드를 검증하면 확인이 되지만 테스트를 하면서 발견하기란 쉽지 않기 때문에 자동 점검 툴을 이용하여 취약점을 확인 하는 것이 좋다 . 아래는 서버로 전달되는 파라미터 값에 악의적인 쿼리를 삽입하는 경우에 대한 예시이다 . * 정상적인 요청 http://injectionTest.com/info.jsp?id=member1 String id = request.getParameter("id"); //member1 이라는 값이 넘어옴 String query = "SELECT * FROM member WHERE memId='" + id + "'"; //id 에 담긴   id 로 DB 조회하여 데이터를 돌려줌 위와 같이 조회를 할 경우 해당 파라미터로 넘어온 id 의 데이터만 조회가 된다 . 하지만 id 파라미터 값에 아래와 같은 쿼리를 추가하여 전달하면 해당 테이블의 모든 데이터가 조회된다 . 이럴 경우 해당 사이트의 모든 가입자 정보가 유출되게 되며 이 정보에 개인 고유의 정보나 금융거래 관련 정보가 있을 경우 실제 금전적인 피해도 발생한다 . * 취약점을 이용한 요청 http://injectionTest.com/info.jsp?id=' or '1'='1 위와 같이 id 의 변수 값에 ' or '1'='1 을 전달하면 OR 조건으로 무조건 참이기 때문에 데이터가 유출이 되며 이러한 데이터 유출 뿐만 아니라 사용자 패스워드 항목에 악의적인 쿼리를 전달하면 로그인 검증 역시 통과하게 된다 . 지금 설명한 데이터 조회 , 로그인 우회 외에도 데이터 조작 및 삭제도 가능하기 때문에 웹사이트에 심각한 영향을 끼치는 공격이다 . 이

Apache POI - the Java

public ArrayList<String> getXslxToArray(String fileName) { ArrayList<String> rowList = new ArrayList<String>(); try { org.apache.poi.xssf.usermodel.XSSFWorkbook xwb = new org.apache.poi.xssf.usermodel.XSSFWorkbook(new FileInputStream(new File(fileName))); boolean isNull = false; for (Row row : xwb.getSheetAt(0)) { //행구분 StringBuffer sb = new StringBuffer(); for (org.apache.poi.ss.usermodel.Cell cell : row) { //열구분 isNull = false; switch (cell.getCellType()) { case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING: sb.append(cell.getRichStringCellValue().getString()); break; case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_NUMERIC: if(DateUtil.isCellDateFormatted(cell)) { sb.append(cell.getDateCellValue().toString()); } else { sb.append(Integer.toString((int)cell.getNumericCellValue())); } break; case org.apache.poi.ss.usermodel.Ce