pms project study
pms 03
Scanner 사용
- 클래스 밖에 import java.util.Scanner; 로 임포트를 해두면 사용하기 편하다.
- 사용법
- Scanner sc = new Scanner(System.in);
- 사용이 끝나면 닫아줘야 한다.
int를 스캐너로 받을 때
- int no = sc.nextInt();
- 숫자를 입력하고 엔터를 쳤을 때 nextInt()는 숫자만 읽어가고 엔터가 남는다.
- 이후 sc.nextLine();을 하면 남아있던 엔터가 읽혀서 원하는 문자열을 입력하지 못하게 된다.
- 이 문제를 해결하기 위해 nextInt(); 아래에 nextLine();을 미리 삽입해서 엔터를 읽고 끝내도록 한다.
시작일과 종료일을 입력받을 때
- java.sql.Date 를 임포트한다.
- Date startDate = Date.valueOf(sc.nextLine()); 으로 받는다.
상태를 입력받을 때
- int status = Integer.valueOf(sc.nextLine()); 으로 입력받는다.
- 출력 시에 조건문을 사용한다.
- switch 문을 사용해서 조건문을 출력한다.
pms 04
배열을 사용해서 변수 배열을 새로 만든다.
- String[] 변수이름 = new String[갯수];
- 위에서 배열로 정의한 변수는 아래 조건문에서 앞에 String을 붙이지 않아도 된다.
반복문을 돌릴 때 횟수가 늘어날 때 아래쪽에 size를 붙인다.
배열의 길이를 변수로 따로 지정해서 관리한다.
- final을 붙여서 상수로 관리하면 아래쪽에서 변경되지 않는다.
switch 문을 써서 진행중, 완료, 신규를 나눠서 표시할 수 있다.
- 배열로 바꿨을 때 상태표시를 나타낼 스트링 변수를 하나 준비한다.
- 그 변수에 진행중, 완료, 신규를 넣는 스위치 문을 만들어서 출력 부분에서 변수를 출력한다.
pms 05
명령어를 반복해서 받을 때는 while 문을 사용한다.
- while 문이 언제나 참이면 무한 루프가 되기 때문에 loop를 사용해서 원하는 구간을 반복시키고 빠져나갈 수 있도록 한다.
명령어 입력을 받아 명령을 구별할 때는 switch 문을 사용한다.
- 케이스에 따라 명령 구분이 가능한 스위치 문을 사용한다.
pms 06
변수들은 다른 메서드에서도 사용할 수 있도록 스태틱을 붙인다.
메인 메서드에는 메서드 호출만 하도록 만든다.
호출당하는 메서드들은 스태틱을 붙인다.
명령 입력문을 프롬프트 메서드로 만든다.
- 프롬프트 메서드의 파라미터를 스트링으로 받는다.
- 입력받는 기능에 프롬프트 제목을 바꿀 수 있게 만든다.
- 리턴하는 값에 맞춰 리턴 타입을 정한다.
- 메소드명은 아규먼트 타입에 맞춰서 알아보기 쉽게 적는다.
- 리턴할 때 파라미터가 스트링이기 때문에 스트링을 인트와 데이트 타입으로 바꿔서 리턴해야 한다.
pms 07
(add) static 변수를 클래스로 묶었을 때
- class 로 인스턴스 메모리를 만들 때 타입과 이름만 지정한다.
- 배열로 되어있을 필요가 없다.
(add) 클래스로 인스턴트를 만들 때
- 멤버 인스턴스를 담을 레퍼런스 배열을 만들어야 한다.
- 길이와 사이즈는 클래스에 포함하지 않는다.
(add) 회원 정보를 담을 메모리 생성
(add) 인스턴스 주소를 레퍼런스 배열에 저장
(list) 레퍼런스 배열에서 인스턴스 주소를 꺼내서 레퍼런스 변수에 저장.
add 의 반복문은 지워줘야 add 메서드를 한번 완료하고 빠져나온다.
pms 08
프롬프트, 멤버 핸들러, 프로젝트 핸들러, 태스크 핸들러로 분리시킬 때 앞에 클래스 주소를 붙여준다.
pms 09
util 패키지를 새로 만들어서 프롬프트를 옮긴다.
pms 10
findByName 클래스를 만들 때
이름을 공란으로 처리하는 명령을 만들때는 문자열 길이를 비교하는 것이 좋다.
pms 11
보드 핸들러를 만들 때 퍼블릭 클래스 이름과 스태틱 클래스 이름을 헷갈리지 않도록 주의한다.
pms 12
pms 15
pms 16
- 리스트를 각각 나눠서 사용하니 번잡하기 때문에
- 어레이리스트 하나를 만들고 배열 타입을 오브젝트로
- 오브젝트로 하니까 아무 주소나 다 담을 수 있어서 제네릭을 사용해서 무엇을 담을지 미리 지정
17
18. CRUD
19. 배열 대신 연결 리스트 자료구조 사용하기
20. 스택 자료구조 구현과 활용
21. 큐 자료구조 구현과 활용
22. 상속 : 일반화(generalization)를 이용한 공통점 분리
23. 추상 클래스와 추상 메서드
24. 인터페이스를 활용한 객체 사용 규칙 정의
25. Iterator 디자인 패턴
26-a. 중첩 클래스 : 스태틱 중첩 클래스(static nested class)
26-b. 중첩 클래스 : 논스태틱 중첩 클래스(inner class)
26-c. 중첩 클래스 : 로컬 클래스(local class)
26-d. 중첩 클래스 : 익명 클래스(anonymous class)
27. 자바 컬렉션 API 사용하기
28-a. ‘Command’ 디자인 패턴을 적용하기 : 메서드를 객체로 분리하기
28-b. ‘Command’ 디자인 패턴을 적용하기 : Map 을 이용한 커맨드 객체 관리
29. 예외가 발생했을 때 시스템을 멈추지 않게 하는 방법
30-e. 파일 입출력 API : 리팩터링 I
31-a. 파일 입출력 API : 텍스트 형식(CSV 파일 포맷)으로 데이터를 읽고 쓰기(FileReader/FileWriter)
31-b. 파일 입출력 API : 버퍼 사용하기(BufferedReader/BufferedWriter)
31-c. 파일 입출력 API : 리팩터링 I
31-d. 파일 입출력 API : 리팩터링 II
32. JSON 형식으로 객체를 읽고 쓰기 : Gson 라이브러리 활용
33-a. Observer 디자인 패턴 : 프로젝트에 적용하기
33-b. Observer 디자인 패턴 : Observer 객체를 통해 파일 다루기
34-a. 네트워크 API를 활용한 C/S 아키텍처 : 클라이언트/서버 프로젝트 준비
34-b. 네트워크 API를 활용한 C/S 아키텍처 : 간단한 메시지 송수신
34-c. 네트워크 API를 활용한 C/S 아키텍처 : 사용자가 입력한 명령처리
34-d. 네트워크 API를 활용한 C/S 아키텍처 : 응답 프로토콜 변경
34-e. 네트워크 API를 활용한 C/S 아키텍처 : 다중 클라이언트의 요청 처리
34-f. 네트워크 API를 활용한 C/S 아키텍처 : 다중 클라이언트의 동시 접속 처리
34-g. 네트워크 API를 활용한 C/S 아키텍처 : PMS 코드를 C/S로 분리
35. 동일한 자원으로 더 많은 클라이언트 요청을 처리하는 방법 : Stateful을 Stateless로 전환하기
36-a. 스레드풀을 이용하여 스레드를 재사용하기 : 스레드풀 구현하기
36-b. 스레드풀을 이용하여 스레드를 재사용하기 : 자바에서 제공하는 스레드풀 사용하기
37-a. 데이터 관리를 DBMS에게 맡기기 : JDBC API 사용하기
37-b. 데이터 관리를 DBMS에게 맡기기 : SQL 삽입 공격과 자바 시큐어 코딩
37-c. 데이터 관리를 DBMS에게 맡기기 : 무결성 제약 조건 다루기
37-d. 데이터 관리를 DBMS에게 맡기기 : 무결성 제약 조건 다루기 II
38-a. 데이터 처리 코드를 별도의 클래스로 분리하기 : DAO 클래스 도입
38-b. 데이터 처리 코드를 별도의 클래스로 분리하기 : DAO 인터페이스 도입
38-c. 데이터 처리 코드를 별도의 클래스로 분리하기 : 의존 객체 주입과 DB 커넥션 객체 공유하기
38-d. 데이터 처리 코드를 별도의 클래스로 분리하기 : 트랜잭션이 필용한 이유
39. 로그인/로그아웃 구현하기 : 사용자 인증(authentication)하기
40-a. 커맨드 실행 전/후에 기능 추가하기: 디자인 패턴 적용 전
40-b. 커맨드 실행 전/후에 기능 추가하기: Chain of Responsibility 패턴 적용
40-c. 커맨드 실행 전/후에 기능 추가하기: init() 와 destroy()의 필요성
41-a. DB 프로그래밍 더 쉽고 간단히 하는 방법 : Mybatis 퍼시스턴스 프레임워크 도입
41-b. DB 프로그래밍 더 쉽고 간단히 하는 방법 : Mybatis 기타 기능 활용하기
42. MyBatis의 다양한 기능 활용법
43. DAO 구현체를 자동으로 만들기
37 - 애플리케이션 서버가 등장한 이유!
38 - 트랜잭션이 필요한 이유!
39 - 여러 스레드가 동시에 같은 커넥션을 사용했을 때 발생되는 문제와 해결책
40 - 스레드 로컬 변수를 활용하여 작업 간에 DB 커넥션 공유하기
41 - 커넥션 재사용을 위해 커넥션풀 적용하기
46 - 객체 생성을 자동화하는 IoC 컨테이너 만들기
47 - IoC 컨테이너 개선 : 애노테이션을 이용한 객체 관리
48 - 인터페이스 대신 애노테이션으로 메서드 구분하기
49 - CRUD 메서드를 묶어 한 클래스로 분류하기
50 - Spring IoC 컨테이너 도입하기
51 - Spring IoC 컨테이너와 MyBatis 연동하기
52 - 애노테이션을 이용하여 트랜잭션 제어하기
53 - Log4j를 사용하여 애플리케이션 로그 처리하기
54 - Web 기술 도입하기
You may also enjoy
less than 1 minute read
TIL
less than 1 minute read
TIL
less than 1 minute read
TIL