멀티캠퍼스 JAVA 백엔드 부트캠프/정리

멀티캠퍼스 백엔드 개발자 취업캠프(Java) 입과 13주차 정리

5ein 2023. 5. 2. 03:34

2023.04.24

오전수업에서는 몽고db를 깔았다. 몽고DB 클라이언트 프로그램(compass, studio-3T)도 깔았다. 

ex) mysqld 클라이언트 프로그램(Dbeaver 등등)

 

회사에서 RDB를 주로 쓰고, 반정형이 필요할때만 몽고db를 쓰기 때문에 프로젝트에서는 RDB를 주로 쓰는게 가장 좋다고 하셨다. 그외에 부가적으로 몽고db는 가능하다고 하셨다.

 

질문

RDB뭐쓰셨어요?   mysql이랑 오라클 사용해봤어요

NoSQL뭐써봤어요?   몽고db 써봤어요.

그 외에 뭐있는지 아세요?   redis, Dynamo 등이 있어요.

db의 분산환경을 만드는 기법이 뭔지 아세요?   샤딩입니다,

샤딩의 종류를 말해보세요.    가로샤딩(로우복제), 세로샤딩(컬럼복제) 가 있습니다.

네트워크의 분산환경을 만드는 것은? 클라우드

 

mongoDB

- flexible schema. 정해진(고정된) 스키마가 없음.

- High Availability(고가용성). 자체 기능이 많음. 별도의 부가 비용 불필요

- shard(조각) 데이터분리 가능 (행: 가로샤딩, 열: 세로샤딩)

- Secondary Index 임의의 추가적인 인덱스를 설정할 수 있음.

- in memory 처리 속도가 빠르다. (장점이면서 단점)

 

RDBMS와 MongoDB 데이터 계층구조

RDBMS와 MongoDB 데이터 계층구조

 

mongoDB compass를 사용해보았다!

mongoDB compass로 조건검색 하

Filter: 찾을 적는 곳

project: 나타낼 항목 적는 곳 (나타낼항목 1, 나타내지 않을 항목: 0)

sort: 정렬어떻게 할지 적는 곳 (오름차순 1, 내림차순 -1)

limit: 데이터 나타낼것인지 개수 적는 곳

 

 

미니미니 팀플 프로젝트에서 내가 맡을것을 상의해보기


2023.04.25

Compass 무료, 사용법이 쉽지만 기능이 3t보다 없다.

studio-3t 1 무료 그 뒤로는 유료로 전환된다.

 

studio-3t 사용법을 배웠다!

비교/논리 연산자

//미션
//--memo.csv를 다시 IMPORT해주세요.
db.memo.find({})
//1. office: wordware인 사람의 age, phone검색
db.memo.find({office: "Wordware"}, {age:1, phone:1})
//2. age:1인 사람의 office, name검색한후, 갯수확인(count)
db.memo.find({age: 1}, {office:1, name:1})
db.memo.find({age: 1}, {office:1, name:1}).count()
//3. age: 200, name:hong, office:busan, phone:011 추가
db.memo.insert({ age: 200, name: "hong", office: "busan", phone: "011"})
//4. 전체검색
db.memo.find({})
//5. age가 2인 사람의 office를 seoul로 수정(1개의 document)
db.memo.updateOne({age: 2}, {$set: {office: "seoul"}})
//6. age가 2이거나 office가 busan인 사람의 전체 목록 프린트
db.memo.find({$or : [{age: 2}, {office: "busan"}]})
//7. age가 3인 사람의 document를 삭제후, age가 3인 사람을 검색
db.memo.deleteOne({age: 3})
db.memo.find({age: 3})
//8. name이 Didi인 사람의 office를 ulsan으로 변경, name이 Didi인 사람 검색
db.memo.updateOne({name: "Didi"}, {$set: {office: "ulsan"}})
db.memo.find({name: "Didi"})
//9. memo에 있는 사람 전체 삭제
db.memo.deleteMany({})
db.memo.find({})
//10. memo collection삭제후 전체 collections목록 프린트
db.memo.drop()
show collections

 

 

미니미니 팀플 프로젝트에서 내가 맡을것을 또! 상의해보기

미니미니 팀플 프로젝트에서 내가 맡을것을 상의해보기

팀플 미니 프로젝트에서 내가 할 것:
회원에대한 크루드를 할것임
어떤 게시판에 회원정보에서 보여줄거다(글쓴거, 댓글)
통계에 대해 낼꺼다 (어떤거 통계낼지 2가지 이상 <권장3개>) 게시판 질문, 
faq게시판에 올린 것 리스트업 횟수 등등 어느게시판에 
코스를 보고 즐겨찾기 목록 등…
마이페이지 db 만들기

<<강사님이 해준말씀 막 받아적었다!>>
우리사이트의 차별화…? 어떤부분이 차별화되는지
왜 이것을 만들었는지?(기술면접때 물어봄)
이사이트를 사람들이 왜 와야하는가?: ex)경남권만 서비스하는곳이 없다, 하나로 모아져있는사이트가 없더라 등등..
데이터에서 차별성 (숨겨진 맛집, 등) 그 데이터는 어디서 가져올지? 
블로그에서 숨긴맛집이다 이러면 그정보를 가져올수는 있대..
내생각: 네이버나 카카오 구글 평점 높은 것 리스트..?,
다른곳에서 데이터 가져오고 끝날지 아니면 주기적으로 업데이트 되는 것인지..?
트위터나, 인스타 같은 해시태그를 사용해서 가져오는방법(크롤링(동적크롤링 라이브러리, api로 가져오는 방법)
나만의 코스를 짠다던가 나의 최적화된 추천.. 이런 게 이사이트에 부각이되어야함…

찜하기: 코스랑(공개/비공개), 다솜님축제, 관광지, 맛집

자녀, 반려동물, 취향,자차 보유? 이런 정보 회원가입끝나고받아서 이것을 토대로 추천 해주겠다..

수익창출방법. (다른사이트에서는 이런걸로 수익을 얻더라.. 우리도 그렇게)
어떻게 수익을연결할것인지 2개정도…
공익성을 한다면 이 사이트가 만드는 주체가 뭔가..

왜 이것을 만들었는지?(기술면접때 물어봄)
왜 만드셨어요? 라고 하면 표현 할 수 있어야함.. 어떤식으로 차별화 이것에 부합한.. 이런 느낌으로
기업에서 제일 싫어하는말: 이회사가 다양한 사업을 많이하고싶고 많이 배우고싶어서라고 하면 싫음: 
(회사에서는 같이 해결(일할) 사람을 구하는것임) <배우고싶은사람 금지!!!!>


2023.04.26

user 추가하고 스프링에서 mongoDB JDBC(CUD) 함!

Find 하려면 VO가 있어야함!

 

미니미니 팀프로젝트 어제에 이어서 하기

 

내가 하는것중 우리 프로젝트의 차별성, 편리성 생각나는대로 적음!

-          나의 활동기록 조회(내가 작성한 게시판 , 댓글 조회)기능, 장소, 음식점, 코스 찜하기 기능으로 원하는 정보에 빠르게 접근 가능 ⇒편리성 

-          회원가입 별도로 진행하는 설문을 통해 이용자에게 알맞은 장소를 추천해 경남권 여행에 흥미유도 가능 

-          챗봇기능으로 여러가지 문의에 빠르게 답변가능

 

저는 회원정보에 대한 크루드를 구현하고, sns 소셜 로그인을 구현할 예정입니다.

그후 회원가입 이후에 장소, 코스를 추천하기 위해 필요한 정보를 수집할 설문 폼을 만들 예정입니다.

또한 마이페이지에서 회원의 활동을 통계 내어 내가 작성한 게시판 , 댓글, 문의 글을 조회하는 기능과 놓은 장소, 축제, 코스들을 바로 조회할 있도록 구현할 예정입니다.

어떤 게시판에 회원정보에서 보여줄것인지(글쓴거)???? 팀원들과 회의 해보기!


2023.04.27

이번주 토요일에 하게될 첫 멘토링을 위해서 매니저님이 멘토분들을 간단하게 소개페이지를 만들어서 보여주셨다.

그리고 멘토분들께 질문할 것을 미리 정해놓으라고 하셨고

멘토링 일정도 같이 알려주셨다!

 

pom.xml에 JDBC드라이버와 mongoTemlplate !!    <Template은 framework랑 비슷한 뜻인데 조금더 약한 뜻>

root-context.xml 에 싱글톤 해주기!

 

시험전 정리

몽고DB
-------
1. noSQL류, json형태로 저장 {키:값}, db --> collection --> documents

				     rdb)) db --> table --> row --> colum
2. document는 csv file, jsom file import 할 수도 있고,
		 json형태로 다큐먼트를 넣을 수 있음.
3. 데이터 타입은 mongodb보다 rdb가 더 많음.
4. _id가 자동으로 모든 컬렉션에 생긴다.
5. mongoDB - CRUD할 수 있는 명령어를 쳐서 결과를 보는 화면을 제공하는 프로그램: 몽고쉘
		 insertOne({}), insertMany([{}, {}])
		 find({}) ==> {}는 검색조건을 넣어주는 부분(json형태로)
		 updateOne, updateMany ==> 조건을 만족하는 document가 여러개 있다고 하더라도
						   updateOne은 하나의 document만 업데이트!
						   updateMany는 여러개의 documents를 모두 업데이트!
		 deleteOne, deleteMany({})
		 count(): documents의 전체 개수
		 sort(): documents들 정렬할 때
		 limit(): documents의 개수를 지정(3)
		 find({"age":100, "name":"hong"}) ==> and조건(두 개다 만족하는 documents검색)
		 find({"age":100}, {"age":1, "phone":1}) //age가 100인것 중 age, phone 항목(item)을 검색
		  ==> 프로젝션(projection): ex) name, age, phone, addr 중 age, phone 항목 선택 하는 것을 뜻함
		     select name, age from member where age = 100;
		  ==> 앞의 {"age":100} 부분을 필터(filter)라고 함.
6. 분산환경에 적합, micro service 구조에 적합(msa), 인메모리, 스키마가 유동적
   샤딩(일부분, 조각만 복제해서 사용)은 rdb, mongodb에도 있음.
   고가용성(가격대비 다양한 활용이 가능), 반정형에 적합
   index(목차) - rdb, mongodb도 pk로 설정하면 자동으로 목차를 만들어준다.
		    부가적인 목차생성도 가능하다.(내가 임의로)
		    목차 사용이유: 검색시 목차를 이용하면 속도가 빠르다. read작업시 유용하다.
7. 몽고db 클라이언트 프로그램 = 몽고db compass, 몽고db studio-3t 를 사용해봄
				몽고db compass - csv import, json data 넣음, but 몽고shell이 없음(명령어 안됨)
				몽고db studio-3t - csv import, json data 넣음, 몽고shell 사용가능!
8. 몽고db와 java연동 필요 파일 - 몽고 db 드라이버 파일, mongoTemplete(framwork) 파일
					스프링에서 연동할 때는 pom.xml에 dependency로 설정함.
					몽고db연결할 때 필요한 데이터들: url(localhost), port(27017), user/pw



웹소켓 _ openAPI
----------------
1. 웹소켓으로 할 수 있는 것 - 1:1, 1:n채팅, 챗봇
2. 웹소켓: 브라우저와 스프링프로젝트(톰킷)의 연결을 끊지 않고 계속 유지해주는것
3. openAPI: 무료 + 유료 (open이라고 해서 모두 무료는 아님)
	ocr 서비스: 그림, 사진을 주면 글자를 추출해줌.
			ex) 주민등록증을 사진을 찍어서 올리면 이름, 주민번호, 주소 등의 글자를 
			    추출해서 자동으로 입력폼에 넣어줌.
	네이버, 카카오, 날씨(해외), 환율, 공공데이터, 결재
	openAPI에서 응답할 때 보통 사용하는 문서포맷은? json, xml
4. 자연어: 사람이 쓰는 언어 <---> 기계어: 컴퓨터가 쓰는 언어
	ex) 안녕, 잘가~ 의 의미를 컴퓨터가 알수가 없음.
	  하이고, 힘들다.! ==> 피곤!(이건 피곤한거야 라고 알려주는 프로그램 짬) 
      ==> 안마의자, 쿠션, 여행지(추천)

 

이후 미니미니 팀프로젝트의 insert를 구현했다.


2023.04.28

이 프로젝트를 할만한 가치가 있는 것 인지 추가적으로 회의하기

 

Mysql 몽고db 무엇을 사용해야하냐 하면 ?

Mysql 무조건쓰고(안쓰면 감점, RDB 요구하기때문) 그외에 추가적으로 할것있으면 몽고db까지.. 하면 된대(몽고db 플러스 알파)

몽고db fk기능은 없다.

 

프로젝트 선정동기에 ~ 해보고싶어서 금지!! < 하고싶은지가 빽빽하게 해야함>

 

어제하던 미니미니 팀프로젝트의 insert부분을 계속 진행하다가 오류가 나서 보조강사님과 오류 찾기(트러블슈팅)을 했다!


2023.04.29 ~ 2023.04.30

4.29 멘토링:

강사님들의 개인 소개와, 그 외의 질문지에 강사님들이 답변하는것을 진행했다.

코드리뷰가 중요하다는 사실과, 테스트 코드의 존재에 대해서도 알게 되었다.

 

클라우드에서의 배포 종류

블루/그린 배포 : 오류가 나면 빠르게 롤백이 가능하다.

카나리 배포 : 전체적으로 문제가 없는지 보고 점점 배포가 된다.

 

설계도 없이 시스템을 운영하는것은 말도 안된다. 모델링은 필수!!

 

예전에는 api라고 말을했고 요새는 백엔드와 프론트분리를 많이하는것이 트렌드이다. (백엔드는 REST API)

 

예외처리와 커밋메세지를 쓰는 방법도 약간 설명해주셨다. (커밋메세지 꼭꼭 쓰기)

예외처리할때 예외를 어떻게 복구할것인가?, 회피할것인가?에 대한 후처리가 중요하다고 하셨다.

 

클린코드를 쓸수록 좋은 코드가 나온다는것도 알려주셨습니다. 그렇지만 너무 클린코드에 집착하지는 말라고 하셨습니다.

또한 에러를 문서화 시켜서 어떤방식으로 해결을 했다라는것을 기록해두고, 말할 수 있어야 한다고 하셨습니다.

openAPI 사용해보는 경험을 많이하면 좋겠다는 말씀도 하셨습니다.

 

Commit Message 규칙

Commit message 규칙
- 제목과 본문을 한 줄 띄어 구분
- 제목은 50자 이내
- 제목 첫 글자는 대문자
- 제목 끝에 마침표 X
- 제목은 명령문으로, 과거형 X
- 본문의 각 행은 72자 이내 (줄바꿈 사용)
- 본문은 어떻게 보다 무엇을, 왜에 대하여 설명

기본적으로 commit message 는 제목, 본문, 꼬리말로 구성된다.
제목은 필수사항이며, 본문과 꼬리말은 선택사항이다.

commit message Tyoe
- feat : 새로운 기능 추가, 기존의 기능을 요구 사항에 맞추어 수정
- fix : 기능에 대한 버그 수정
- build : 빌드 관련 수정
- chore : 패키지 매니저 수정, 그 외 기타 수정 ex) .gitignore
- ci : CI 관련 설정 수정
- docs : 문서(주석) 수정
- style : 코드 스타일, 포맷팅에 대한 수정
- refactor : 기능의 변화가 아닌 코드 리팩터링 ex) 변수 이름 변경
- test : 테스트 코드 추가/수정
- release : 버전 릴리즈

 

기술면접을 우리팀만의 기능 같은 것을 관심있게 보시기 때문에 차별성이 중요하다고 하셨다.

추가 작업계획과, 그 당시에 궁금했던 점도 정리해두면 기술면접때 도움이 많이 될것이라고 하셨다.

 

프로젝트를 끝낸후 시현영상을 꼭 찍어두는것이 중요하다. (발표할 때 시현이 안되는 불상사가 생길수 있기 때문이다)

 

코딩테스트는 이렇게 준비 하셨었다고 알려주셨다.

가장쉬운단계부터 푸는게 중요 정복한다고 생각하고 점점 단계를 높여서

중간정도 난이도는 어렵지않게 풀수있게 연습을 하셨대

내가 진짜 어려워하는 부분들을 집중적으로 보고

내가 가고자 하는기업의 코테가 어떤식으로 나오는지 기업의 방향성을 보고 기업의 기출문제라던지 풀어본다.

 

자신감이 없더라도 높은곳에 지원을 해는것을 권장한다고 하셨다. 

만약 면접까지라도 가면 기술면접으로 자신의 수준을 알수있기 때문에 이득! (블로그의 면접 후기 같은것도 보고 가기)

 

SBI, STAR(Situation, Behavior, Impact / Situation, Task, Action, Result) 이런 포멧으로 면접답변 연습하기.

S : Situation - 상황을 포착한다

B : Behavior - 행동을 설명한다.

I : Impact - 행동이 끼친 영향을 전달한다.

 

한 멘토님꼐서 row를 100만개 이상 넣고 조회(자바 스프링 RDB) 를 해보는 경험을 하면 좋을것같다고 하셨다.

row가 많아지면 조회부터가 안되고 인덱스를 찾을수 밖에 없는데, 그것을 해보면서 어느수준으로하면 인덱스를 써야겠다 그게 안되면 캐쉬를 써야겠다 이런것을 알게되고, 많은 데이터를 어디서 가져오고, 어떻게 넣을지 생각해보는것 부터가 시작 이라고 하셨다 (테스트데이터를 사용할수도 있고, 공공데이터포탈, 언플래쉬 등의 사이트를 이용하는방법도 있다)

 

팀프로젝트 짧은 소

저희는 부산경남 맛집, 장소를 총망라한 사이트를 만들것입니다.
저희사이트의 특징은 키즈존, 주차장유무, 수유실 등의 정보를 안내하는 페이지가 있다는점과,
코스를 직접 짤수도 있고, 다른사람의 코스를 찜할수 있는 기능을 가졌습니다.
...
...

내가 맡은 부분!
회원정보페이지
저는 회원정보에 대한 크루드(CRUD)를 구현하고, 네이버 API등을 이용한 소셜 로그인을 구현할 예정입니다.
이후 회원db와 각 페이지의db를 연결하여 회원의 닉네임으로 후기 및 댓글, 커뮤니티글을 쓸 수 있도록 구현할 예정이며,
마이페이지에서 회원의 활동을 통계내어 회원이 작성한 게시판 글, 후기(리뷰), 문의 를 조회하는 기능과 
관심 장소, 맛집, 축제, 코스를 찜목록으로 바로 조회할 수 있도록 구현할 예정입니다.
이후 장소, 코스를 추천하기 위해 필요한 정보를 수집할 설문 폼을 만들예정입니다.
이후에는 챗봇 기능까지 구현하는것을 목표로 하고있습니다.

멘토님 답변

맛집이라는 데이터의 신뢰성은 어떻게 증명할 것인지부분에 대해 지적하셨다.
만약 데이터 들을 가져온다면 초반에 그 데이터가 맞는 정보인지 확인하는 작업도 병행되어야한다고 하셨다.

나만의 코스를 만들고 그것을 sns에 공유하는것도 이사이트에 유입을 높일수 있는 방법이 될수 있을것 같다고 말씀하셨다.

상세 WBS를 작성하는것이 좋다고 하셨다(기능이 한눈에 보이고, 그사이에 추가할것과 뺄것이 보인다.)

보여주는 기능들이 많지 않고 전체적으로 심플한것 같다고 하셨다.

또다른 멘토님 꼐서는
어떻게보면 기능이 좁다 다르게 말하면 더 완성도 있다라고 할수있겠다고 하셨으며,
또한 어드민(관리자) 페이지를 필수로 만드는것이 좋다고 하셨고, 관리자를 초반에 만드것을 추천 하셨다.

주제자체는 관광에대한 토픽은 할것은 많다고 생각하지만, 부트캠프에서 많이들 다루는주제이기 때문에 
보여주는 기능말고는 특별한것은 없는것 같다고 하셨다.
이에 어떤거를 메인기능으로 가져갈지 또는 여기에 플러스알파로 뭘 할지에 대해 상의를 해보는것이 좋을것 같다고 하셨다.
또한 관광이라는 카테고리는 샘플데이터가 많이 준비되어야할것 같다고 하셨다.

관광을 추천해서 보여준다는것이 어렵기 때문에 특정한 사용자만 사용할 수 있는 사이트나, 
나의 여행일기 이런식으로 해서 사진첩을 이용해서 사진을 보여주고 먹었던 음식들 일기처럼 
자동으로 생성되게 보여주고 이런 아이템으로 개인화 하는것도 좋을것 같다고 하셨다.
예로 캘린더 같이 나만 사용하고 , 기록하는 이런것으로 개인화!

 

이에 우리조는 주제를 변경하자는 쪽의 말이 나왔다. 다음주에 그부분에 대해서 강사님과 대화를 더 하기로 하였다!

우리팀 ! 잘할수있을꺼야!!! 파이팅!!!


일요일과 월요일에는 프로그래머스 코딩테스트 몇문제를 풀고, 이러닝 나머지를 들었다.

강의내용이 어려운것인지 이해가 잘되지 않아서 몇번이고 다시듣다보니 시간이 너무 오래걸린것 같다.

그래도 계획대로 기간안에 잘 끝낸것같아서 다행이다!