22-09-02~22-09-07 개인 스터디 회고록

BRINCE·2022년 9월 8일
0

서론 😁

자바를 공부하기 시작한지 거의 2주가 되었다.

처음에 시작할때는 이걸로 어떤 프로그램을 짤 수 있을지, 어떠한 것 까지 할 수 있을지 모르는 상태였기 때문에

기존에 TIL를 작성할때 많은 어려움이 있었던 상태였고, 그 날 하루하루 뭘 공부해야 할지 뭘 도전해봐야 할지도 모르는 상황이었던 때

현업에서 개발을 하고 계신 모 아무개 씨 께서... 비전공자이자 공부라곤 살면서 해본적 없는 나를 위해 시간을 내주셔서 .. 스터디 플래닝을 해보았다.

플래닝 자체는 어려운게 없었다. 기존에 공부하던 것들을 바탕으로 +@ 해서 내가 더 할 수 있는 , 혹은 실패할것 같아도 도전해볼수있는 기회를 만드는 계획들을 짜보았다.

플래닝 방식은 하루 총 공부/개발 시간을 정한 후 그 주에 며칠을 공부할 것인지 정하고 그 공부시간에 맞게 내가 해야할 일들을 배분하는 방식으로 계획을 짰다.

그렇게 총 4가지 계획을 짰다.

  • 기존에 수강하던 MySQL 강의 한 강의씩 진도 빼기
  • 기존에 공부하던 자바의정석 주마다 한 챕터 끝내기 (대충 하루에 2시간정도 되는듯.)
  • 기존에 재미삼아 만들어놨던 로또 추첨 프로그램에 살 붙이기 (공부하면서 배운 내용 활용 +@ 시도해보기)
  • 코딩 테스트 (프로그래머스,백준 알고리즘)

이렇게 4가지의 계획을 짠 후에 나한테 우선순위가 높은것부터 시간을 배분해서 진행했다.

사실 이론을 공부하면서 머릿속에 넣는것 보다는 실습을 하면서 궁금한게 생길때 그때그때 찾아보고 이용해보는 것들이 머릿속에 오래 남았다.

그래서 우선순위는
1. 프로그램에 살붙이기 (기능 추가 )
2. 자바의 정석 공부하기
3. MySQL 강의 듣기
4. 코딩테스트 문제 풀이

이렇게 정해두고 진행했다.

본론 😉

가장 우선순위가 낮았던 것부터 풀어나가보겠습니다..

코딩테스트 문제풀기

코딩테스트 문제풀이같은 경우에는 자바를 배우기 전에 파이썬을 잠깐 배웠었기 때문에 파이썬으로 프로그래머스,백준 문제를 조금이라도 풀기에는 어려움이 크게 없었으나

자바 자체는 문법이 파이썬과 많이 다르기 때문에 (구조는 비슷하다 생각) 제가 배워온 것들을 가지고는 (이번주에 예외처리 까지 배웠으니 ..) 풀 수 있는 문제가 정말 간단한 것들밖에 없었다.

겪었던 문제

정말 간단해 보였던 문제들도 막상 풀이를 보면 내가 아직 배우지 않은 map 부분, collections,hasInt 등 이런것들을 가지고 풀어나가는 문제들도 많았기 때문에 .. 코딩테스트 문제풀이 같은 경우에는 적어도 문법은 완전히 다 배우고 난 후에 진행하자는 결론을 낳았고.. 코딩테스트 문제풀이를 안하는만큼 다른것들에 더 시간을 쏟으려고 노력했다.

MySQL강의 듣기

MySQL 같은 경우에는 총 5개의 파트를 배웠다.

  • where 문으로 원하는 조건으로 데이터 찾기
  • order by 문으로 정렬 하기. rank() over() 함수로 쿼리 순위매기기
  • 직접 함수 만들어서 사용해보기
  • JOIN 문으로 테이블 합치기 (INNER,OUTER,LEFT,RIGHT)
  • UNION 으로 데이터 더하기
  • 서브쿼리로 더 자세한 조건 정하기

이중에서 가장 이해가 안갔던 부분은 JOIN 문과 함수를 만들어보는 부분이었다.
MySQL 같은 경우에는 이걸로 어떤걸 할 수 있을까 고민을 했으나, 프로그래밍을 하면서 대충 사용법을 알아냈다. 그거는 밑에 로또 당첨 프로그램 얘기에..

자바의 정석 공부

자바의 정석은 천천히 하루에 1~2시간 동안 책/인강 으로 최대한 그냥 넘기는 부분 없이 개념 이해를 하려고 노력했다.

  • 클래스 상속, 패키지
  • 제어자 , 접근제어자 , import, 제어자의 조합
  • 다형성/형변환 , 매개변수의 다형성
  • 추상클래스, 인터페이스
  • 예외/오류 , try/catch , 예외선언

이중에서 가장 이해가 힘들었던 부분은 추상클래스와 인터페이스 였다.

클래스 상속같은 경우에는 extends 를 사용해서 조상클래스,자손클래스 이렇게 세분화를 시킬 수 있었고
예외선언과 try/catch 는 예외가 발생 할 수 있음을 미리 선언하고, 예외가 발생했을때 catch 문으로 그 해당 동작을 한 뒤에 빠져나오는 정도로 이해를 했으나

인터페이스 추상클래스는 이걸 왜 쓰고 어디에 쓰는지 정확히 이해도 안갔고 막상 쓰려고 해봐도 예제문 정도 말고는 실질적으로 어떻게 사용하는지 이해하기 힘들었다.

그래서 검색했었던 글중에 정리가 너무 잘 되어있는 글을 발견했다.
https://myjamong.tistory.com/150
작성자 분께서 마지막에 설명을 너무 잘해주셨다고 생각..

추상클래스 - 조상 클래스도 같고 행동하는 기능까지 완전히 똑같은 기능이 필요한 경우
인터페이스 - 조상클래스가 다르지만 행동하는 기능이 같을경우

이렇게 생각하니 이해가 굉장히 잘됐다.. 굿

로또 당첨 프로그램 살 붙이기

이 주 플래닝을 할때, 당시에 로또 당첨 프로그램은 단순히 로그인,회원가입, 로또 번호 생성 기능 정도만 내가 대충 만들어놓은 상황이었고 이 프로그램에 어떤걸 추가할지는 이렇게 정했다.

  • 회원정보 수정
  • 회원탈퇴
  • 로또번호 5개 (처음엔 한개만 등록가능 했음..)
  • 로또 당첨번호 확인 (단순 1등이 아닌 보너스번호 포함 5등까지 확인)
  • 공지사항 게시판 개발
  • 관리자 계정 권한 설정

이렇게 계획을 했고, 큰거보단 작은거부터 시작을 했다.

1. 회원정보 수정

해당 프로그램을 작성할때, 처음엔 클래스 배열을 생성해서 해당 계정의 정보를 클래스 배열에 저장하는 방식으로 작성을 했었다.

그리고 회원 가입 시에, 회원수 index를 생성해 그 배열에 해당 회원 정보를 저장하는 걸로 작성을 했었다. 마찬가지로 회원 정보에도 회원번호가 들어가있는 상태였다.

회원정보 수정 기능도 마찬가지로 해당 회원번호를 입력 시에 회원정보를 수정 가능하게 기능을 추가하였고, 비밀번호 같은 경우엔 두번 입력해서 두 비밀번호가 일치했을때 변경이 가능하게 만들었고, 변경시에 로그아웃이 되도록 작성을 했다.

2. 회원탈퇴

회원탈퇴 같은 경우에는 또 난관이 있었던게, 단순히 내가 해당 배열 인덱스의 회원정보'만' 지워버리면, 1,2,3,null,5,6 이런식으로 배열이 이상해져 버리고 회원가입을 할때도 1,2,3,null,5,6,7 이렇게 되도록 작성을 해버렸었다 .

알고보니 이런 경우에는 해당인덱스 배열 자체를 null로 비워버리지 말고
for 문으로 null일때 그 다음 인덱스를 앞으로 땡겨오면 오류가 발생 안하고 해결이 가능했다.

그러나 이 경우에는 이렇게 해결해버리면 회원번호가 그냥 자기맘대로 생성되어서 회원번호로 정보를 수정 탈퇴 하는건 의미가 없어졌다.

그래서 이때 구조 자체를 회원번호로 인덱스를 찾아서 배열 정보를 수정하는게 아닌 해당 프로그램 메인에 로그인 세션을 만든후에, 로그인이 되었을 시에 접속중인 아이디를 로그인 세션 변수에 초기화 시킨후, equals로 for문을 돌려 일치하는 정보가 있을때 해당 인덱스에 저장된 내용들을 변경하도록 바꿨다.

그래서 이 때 단순히 회워탈퇴 기능만 추가한게 아니라 그냥 구조 자체를 로그인,회원정보수정,탈퇴 등등 다 for문으로 로그인세션에 들어가있는 아이디를 찾아서 인덱스 정보를 바꾸게 변경.. 하느라 시간이 더 들어갔다.

3. 로또번호 5개 등록

로또번호 같은 경우에는 처음에 5칸짜리 배열을 만들어서 숫자 하나당 ','과 공백을 추가해서 한 번호당 1, 2, 3, 4, 5, 6 이렇게 뽑히도록 설계를 했으나, 이같은 경우에는 번호 추첨을 할때 만약에 1등 번호중에 1번이 있고, 내 번호가 1, 11 ,21 ,31, 41 이렇게 되있으면 그냥 1등으로 뽑아버리는 문제가 발생 ..

그래서 "["+num+"]" 이렇게 등록하게 해 최종적으로 [1][2][3][4][5][6] 이렇게 등록하게 구조를 바꿨다. 이렇게 회원 정보에 ln1,ln2,ln3...ln5 클래스 변수를 추가해 해당 로또 번호를 저장 할 수 있게 만들었다.

4. 관리자 계정 권한 설정

이때 .. 구조적 문제를 정말 크게 느꼈다. 왜냐하면 내가 설계한 것들은 모두 프로그램이 종료되면 내가 저장했던 배열들이 다 날라가기 때문에 ..

나중에 남은 두개 (공지사항,당첨확인) 을 만드려면 프로그램 실행 내내 회원가입,로그인,계정설정,번호등록 등등 을 다 해야지 테스트가 가능하다는 생각이 들었다 .

그래서 이때 어떻게 하면 좋을까 생각을 하다가, 어 ? 하고 들었던 생각이 ..

이러려고 MySQL 배운게 아닌가..?

라는 생각이 들어버렸고.. 이때 갑자기 신들린듯이 자바,MYSQL 연동 방법을 찾은후에 .. 시도해보기 시작했다.

내 mysql 서버에 해당 프로그램에 필요한 테이블들을 먼저 만들어주었다.
로그인에 필요한 테이블 (회원정보를 저장할)을 먼저 만든후에 ,

이렇게 import 를 해주고, MySQL 연동에 필요한 변수들을 선언해준 후 ..

이렇게 유저 정보를 가져올 UserDAO 매서드와 클래스를 생성했다 .

그렇게 모든 기능 하나하나 다 MySQL에 연동되도록 구조를 바꿨다.

이런식으로 배열이 아닌 회원정보 테이블에 정보를 저장하도록 바꿨고, 로그인 시에도 배열의 정보를 찾아서 로그인하는게 아닌 SELECT 문으로 아이디,비밀번호를 가져와 매치가 됐을때 로그인 하는 방식으로 변경하였다 .

마찬가지로 해당 아이디가 없거나,메뉴를 잘못 입력해 오류가 나거나 하는 것들을 모두 SQLException 예외처리를 해서 프로그램 종료가 아닌 해당 오류에 대한 문구가 출력되도록 바꿨다.

이런 식으로 회원 정보에 admin 컬럼을 추가한뒤에 번호가 1일시에 관리자 모드로 실행되게, 번호가 0일시에 회원모드로 접속되게 구조를 바꿨다.

이렇게 로그인 시에 admin이 1이면 boolean adminmode 가 true 로 초기화 되도록 했고, 관리자모드는 adminmode가 true 일때만 접속이 됨.

5. 공지사항 게시판

마찬가지로 게시판을 위한 데이터베이스,테이블을 생성해주었고, 해당 게시판의 댓글 내용들을 저장할 테이블까지 생성해주었다.
그리고 BoardDAO 클래스, 클래스메서드를 생성후에 마찬가지로 게시판 데이터베이스를 연결하도록 호출해주었다.

그리고 공지사항 게시판이니 회원들은 댓글달기,수정,삭제 만 가능하고 게시글은 조회만 가능하도록 설정해두었다.

관리자는 게시글 등록, 조회, 수정, 삭제 가 가능하고 관리자가 게시글을 삭제할 시에는 제목만 삭제된 게시글로 표시하도록 했고, 내용은 조회가 가능하도록 설정해두었다.(회원은 불가 ㅋ)

이같은 경우에는 처음에 간단히 while 로 SQL문에서 전달받은 resultset을 출력하게 해서 기능을 구현했으나,

해당 게시글 작성, 댓글 작성,수정 등등 할때 스캐너로 입력받은 것들을 nextline 으로 입력받으면 공백이 들어갈시에 공백 전까지만 입력이 되는 오류가 발생했다 . 그래서 이때 프로그램 내 모든 스캐너를 버퍼리더로 바꾸었다.... 그러니 오류 발생 안함 ㅎ

그렇게 해서 구현한 기능은 이렇다

이렇게 마찬가지로 8자가 넘어가면 ... 이 붙고, 안넘어가면 모두 출력이 된다.

이렇게 댓글을 조회 할 수 있고

관리자모드일때는 삭제된 글도 조회가 가능하지만,

이렇게 일반 회원일때는 조회가 불가능하다.

6. 로또 당첨번호 확인

로또 당첨번호 확인 같은 경우에는, 관리자 모드에서 등록을 원하는 회차의 번호를 입력하면 첫번째 번호~여섯번째 번호 +@ 보너스번호 까지 한개씩 입력하도록 했다.

그렇게 MySQL로 똑같이 1등 번호 테이블을 만든 후에 한번호마다 마찬가지로 매치를 위한 [] 를 추가해 등록을 하도록 했다 .

이렇게 출력 & 등록이 됨.

당첨확인 기능 같은 경우에는

contains 를 활용해 for문을 돌려서 1~6번째 번호가 있을땐 한번호 마다 win이라는 변수를 생성해 여기에 2점을 올려주고, 보너스 번호는 1점을 올려줘 1등은 12점, 2등은 11점, 3등부터는 10,8,6 이렇게 점수를 부여하도록 했다 .

그렇게 프로그램을 돌리면

이렇게 출력이 되며 해당 점수를 회원 mysql 테이블에 저장한다 .

결론👌

실행을 하는것도 중요하지만, 계획을 하는것도 중요하다고 생각했다.

생각했던거 보다 이론공부는 더더욱 지루했고 무엇보다 내가 직접 프로그램을 짜면서 찾아봤던 정보들, 갑자기 궁금해서 찾아봤던 정보들이 확실히 머릿속에 더 잘 들어왔으며 코딩테스트는 잘 모르던 내가 풀면 풀수록 자신감이 떨어지는 부작용을 가져다 주었다 ..

좋았던점😊

  • 내가 직접 무엇을 짜보면서 단순히 이론, 언어문법 뿐만 아니라 구조를 내가 직접 머리로 생각해내고 이걸 실행하고 오류를 발견하고 해결함으로써 문제 해결 능력이 조금 상승함

  • 내가 어떤걸 잘하고 못하는지 이번 스터디로 조금이라도 더 알게됐고 , 다음 다음 플래닝때는 더 구체적인 계획을 짤 수 있을거 같다.

  • 단순히 내가 배우는것과, 하고싶은것과 해야할것을 따로 나눠서 진행하는게 아닌 하고싶은것과 해야할것에 배운것들을 응용함으로써 이론 진도가 더뎌도 확실히 나만의 개념정리가 잘되었다.

  • 프로그램을 짜면서 처음에 구조를 먼저 구체적으로 짜고 시작하는게 얼마나 중요한지 이번에 확실하게 느꼈다. 짜다가 중간에 구조를 바꾸려면 굉장히 많은 시간을 똑같은 기능을 만드는데 사용하게 될것..

  • 내가 아무리 즉흥적인 사람이지만 확실히 하고싶은거만 그냥 아무렇게 하는것 보다는 이렇게 미리 해야할것들을 정해놓고 진행하면 두루두루 능력이 한쪽에만 치우치지 않고 좋아지겠다는 생각이 들었다 .

아쉬웠던점😒

  • 프로그램을 짤때 구조적인 문제를 인지하지 못한 상태로 와다다다 진행하다 보니 , 결국에 사용자 입장에서 테스트를 했을때 코딩을 할때는 발견하지 못했던 부분에서 오류가 발생하는 부분들이 생각보다 많았고, 심지어 이 글 작성할때도 오류를 발견하고 고쳤다 ; 하나를 하더라도 무한리필 보다는 질좋은 적어도 패밀리 레스토랑 정도는 해야겠다는 생각이 들었다.

  • 무작정 프로그램을 짠다고 하다보니 내가 이걸 어떻게 짠거지 하는 생각도 든다. 마찬가지로 클래스 배열가지고 정보를 저장할때는 눈감고도 코딩을 할 수 있을것 같았는데 SQL을 오백번 하다보니 배열쓰는법을 까먹은 수준 ;

  • 시간 배분 문제가 생각보다 아쉬웠다. 나는 무엇을 시작하면 해야겠다 하는건 끝을 내고 보는 성격이라, 자바의정석,MySQL 할때는 오버도 거의 안하고 딱 끝냈는데 프로그래밍 할때는 구조적 오류가 생길때나, 다시 기능을 바꿔야할때 타임 오버를 너무 많이했고 , 내가 정했던거보다 더한 것들을 만들었다. 결국엔 MySQL을 연동할 계획이 없었지만 해버렸고 ..

  • 해야지< 라는 마음가짐이 덜했던것같다. 해야하는데.. 하다가 하는 경우가 많았고.. 이경우에는 아직 제대로된 계획형 스터디는 처음이니 하다보면 많이 발전할것으로 기대가 된다

마치며

처음으로 그나마 계획적으로 뭘 할지 미리 정하고 진행하는 공부를 시작했다.
뭐든지 처음에는 다 할 수 있을거 같다는 생각이 들지만 막상 못할거같은 날이 오면 자기혐오X500..

그래도 이건 첫주니 첫주치고 이정도면 굉장한 발전이 아닐까 하는 생각이 든다 ㅎㅎ

다음주는 더더욱 좋아질 나를 기대하며 ..

profile
자스코드훔쳐보는변태

0개의 댓글