마지막 프로젝트 때 우스개 소리로

설마 플젝 끝난 후 디비 서버 날라가는 거 아냐? 라고 얘기 했는데

3달도 채 안되서 일이 터졌다.

웹서비스 구축을 위해 2개의 aws 서버를 연동하여 
하나는 서비스용, 다른 하나는 디비 용으로 사용 하였는데

디비 서버의 주인께서 문을 닫았다...

그리고 잠수...

후....

덕분에 리눅스 새로 배우게 되니 기분이 좋다^^

# 후... 덕분에 반 강제로 새롭게 서버도 파고 했다.

이번에 새롭게 서버를 파면서 어디를 사용할까 하다가 네이버 클라우드 플랫폼을 써보기로 했다
(아마존은 이미 사용중이고...아직 구직중이니 돈내고 쓰긴 부담 ㅠㅠ)

1. 네이버는 HDD 마이크로 서버에 한해서 1년 무료 정책을 시행중!
단 공인 ip 사용은 유료인데 이는 월 약 4300원 수준.

2. 우분투 환경에 mysql을 설치하고 세팅을 진행하였다.
- 우분투, mysql로 검색하면 세팅 방법이 자세히 나와서 큰 무리없이 하였음.

3. 네이버 플래폼을 썻을때 가장 좋았던 점은 aws를 사용할때 이게 뭐야? 라고 하던 부분에 대해 이해할 수 있었다는 점이다.
- 이전에 putty를 왜 사용하는지 몰랐는데 이번에 알게되었고
- ACG 설정을 통해서 aws에서 포트번호 깨작깨작 하던 이유를 조금이나마 이해하게 됨.

4. 다른 설정들은 큰 문제가 없었으나 2가지에서 막힘
4.1) 이클립스와 db 서버 연결시 ping failed...
- sqlyog, 워크벤치 모두 연결이 됬는데 이클립스에서만 유달리 안됬음.
- 아직도 이유를 모르겠으나 가장 유력한건 서버에서 mysql start를 안해줘서 인듯 함.
- 근데 왜 sqlyog에선 연결이 된거지...
4.2) 연결까지 모두 완료하였으나 db 입력시 한글이 insert가 안된다!
- 분명 설정에서 바꾸어줬는데 왜 그런지 이해가 안감. 내일 다시 확인해봐야지.

4.2-추가) 한글 insert가 안되는 이유
설정을 모두 utf-8로 바꾸었으나 리눅스 상? 의 문제인지는 몰라도 한글이 입력이 안된다.
결국 db 테이블을 utf-8로 바꾸어서 작동시켰다

http://goldenraccoon.tistory.com/entry/mysql-utf8-%ED%95%9C%EA%B8%80%EA%B9%A8%EC%A7%90-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95
(도움을 많이 받았다)

제일 확실한건 db 를 모두 drop 하고 새롭게 만들면서 utf-8값을 주는 것이다.

이로서 임시방편으로 DB 서버도 살리고 웹서비스도 다시 동작하게끔 만들었다.

http://13.125.70.57:8080/

눈물난다 ㅠㅠ 이왕 이렇게 된거 코드 정리좀 하고 새롭게 도메인도 신청하고 해야겠다



지난 프로젝트때 아예 신경을 안썻던 게시판을 이번에 간단히 만들기로 하였다.

다행히 지난번처럼 게시판의 종류는 많지 않게 간단히 DB설계를 하였고 최소한의 기능만을 가진

게시판을 구축하기로..


1) 게시판 내용을 가져오는 것 : 간단하다. List<E>로 받아서 그대로 가져오면 된다.

ModelAndView로 주면 되니 어려운 것은 없다.


2) 게시판 모양 구축 : 페이징 처리.. 이게 어렵다.

쉽지않다. 아직도 진행중이다.

책을 보고 따라 구현해봤으나 확 와닿지 않아서 내 스타일대로 바꾸었다.


2-1) 일단 페이징을 위한 클래스를 따로 생성했다. 책에선 이를 2가지로 구분했지만 나는 일단

유지보수를 생각안하고(...) 하나로 합쳤다.

페이징 클래스를 생성하는 이유는 다음과 같다.


2-2) 기능을 구현하기 위해 일단 흐름을 생각해본다.

게시판을 클릭하면 게시판.jsp로 넘어간다.


이때 db에 저장된 게시글들을 읽어올 것이다 ---- 1번
게시글이 많을 경우 아래에 페이지가 넘버링 되고 클릭하면 다른 게시들을이 나온다 -----2번

prev, next 등의 버튼을 통해서도 이동할 수 있다 -----3번

위의 3가지가 핵심이라 할 수 있다.

1번에서 중요한 점은 from - to를 명시해주는 것, 즉 내가 20개씩 글을 보여주겠다 생각 한다면

0-19, 20-40, 41-59 이런 식으로 짤라줘야 한다는 점.
이를 위해 시작글번호, 끝 글번호가 필요로 하고 이를 클래스에 멤버변수로 만들었다.

(끝글번호 = 시작글번호 + 20)
# 위 두개의 멤버변수는 쿼리문에서 limit 시작 글번호, 끝 글번호 로 불리게 된다.

2번. 게시글이 많다 라는 것은 총 게시물 대비 내가 보여줄 갯수를 비교하여 페이지를 만들어야 한다는 것이다.
만약 총 게시글이 110개이고 20개씩 보여준다면 총 6페이지가 나와야 한다.
그럼 아래 페이지 넘버링은 1부터 6이 될 것이다.

이를 위해서 총 게시글을 db에서 읽어오는 쿼리문과 메서드가 필요로 하고, 이를 저장 할 수 있는 멤버변수 또한 필요하다.
# 하지만 db에 12만게의 게시글을 만들어 놨더니 게시글 불러오는데에 너무 오래걸린다. 이거는 좀더 생각해 봐야할듯

3번 prev는 이전, next는 다음인데 여기서 next를 +1 씩 시킬지, +@로 할지 아직은 안정한 상태

다만 prev의 경우는 현재 페이지가 1일때는 보여서는 안되며 next역시 더이상 다음에 불러올 페이지가 없을 경우에

보여서는 안된다.
그렇기 때문에 prev, next 는 boolean 멤버변수로 설정하여 true, false 값으로 조절 하게끔 해야한다.

1,2,3번을 종합해보면 페이징 클래스에는
시작글번호, 끝글번호, 총글갯수, prev, next 등의 멤버변수들과 이를 설정해주는 다른 메서드들이 추가로 필요함을 알 수 있다.


기본적인 매퍼이다. 게시글에 대한 정보 + 회원에 대한 정보를 조인해서 가져와야 나중에 수정 등을 할 수 있다. 아마 필요하다면 계속 바뀔 매퍼

페이지를 관리하는 클래스 이다. 책에선 이것을 두개로 나누었지만 그게 오히려 복잡해서 하나로 합쳤다. 기본적으로 현재 페이지, 끝페이지, 시작 게시글, 끝 게시글, 이런식으로 구분 하였다. 어제에 비해서 바뀐 것은 next, prev에 값을 갖는 멤버변수를 만들었다는 점이다. 웹상에서 숫자 계산을 해야하는데(예를 들어 현재 페이지가 15이면 next를 누르면 25페이지로 넘어가게끔) 이를 어떻게 해야할지 몰라서 일단 서버에서 다 해결하는 것으로 하였다.

prev, next의 조건을 계산 하기 위한 값. next 조건의 경우 아직 완벽하지 않다.

ModelAndVIew로 건네준다. 글 목록과 페이지관리 클래스를 같이 넘겨준다. 글 목록은 항상 20개씩 나오는데 문제는 불러오는 속도가 너무 느리다는 점. 아무래도 총 게시글 갯수를 확인하는 것 때문에 그런것 같아서 if문으로 한번만 할 수 있게 조건을 주었다. 그래도 느리다. 한가지 더 신경쓴 점은 RestfulAPI를 적용하기 위해 URL을 단순히 하였고 bbs는 기본적으로 ?page=num 식으로 이루어지므로 value, defaule값 등을 주었다.







getMiddle메소드는 하나의 단어를 입력 받습니다. 단어를 입력 받아서 가운데 글자를 반환하도록 getMiddle메소드를 만들어 보세요. 

단어의 길이가 짝수일경우 가운데 두글자를 반환하면 됩니다.

예를들어 입력받은 단어가 power이라면 w를 반환하면 되고, 입력받은 단어가 test라면 es를 반환하면 됩니다.


기본적인 문제, 길이를 읽고, 짝수 홀수를 확인하고, 인덱스로 자른다.

파이썬과 다른게 있다면 파이썬은 문자->리스트-> 슬라이싱 이렇게 하면 되지만

자바의 경우에는 substring메서드를 이용하면 된다.



#digit_reverse함수는 양의 정수 n을 매개변수로 입력받습니다.

#n을 뒤집어 숫자 하나하나를 list로 표현해주세요

#예를들어 n이 12345이면 [5,4,3,2,1]을 리턴하면 됩니다.


포인트는 숫자가 입력되면 이를 거꾸로 해서 리턴.
즉 숫자 -> 리스트화 -> 거꾸로


위에 보인것처럼 순서대로 하여 거꾸로 하고 이를 list comprehension으로 축약한 버젼 이러헥 두개.. 다른 답중에 놀라운 것이 있어서 가져옴..

5월 21일 월요일


행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬을 입력받는 sumMatrix 함수를 완성하여 행렬 덧셈의 결과를 반환해 주세요.


예를 들어 2x2 행렬인 A = ((1, 2), (2, 3)), B = ((3, 4), (5, 6)) 가 주어지면, 같은 2x2 행렬인 ((4, 6), (7, 9))를 반환하면 됩니다.(어떠한 행렬에도 대응하는 함수를 완성해주세요.)










행렬문제는 행렬 이라는 압박감을 벗어나느게 우선인듯. 처음에 예시 문제가 2*2 여서 여기서 함정에 빠졌다. 단순한 로직이지만 중요한 점은 행, 열을 구분해야한다는 것. 다른 분들의 풀이도 비슷하지만 zip(A,B) 함수를 이용한게 신기하였음.

RestFul,

Rest...


많은 기업에서 RestFul api 경험을 묻곤 한다.


처음에는 새로운 언어인가 싶었다. 자주 사용되는 언어인가 싶었는데 그것은 다행히 아니였다.

RestFul 이란 아키텍쳐 스타일, 즉 설계시 사용하는 스타일 이라고 한다.

Resource에 집중하여, 즉 정보에 집중한다고 하는데...


암만 찾아봐도 다들 설명이나 예제가 비슷하다.

그래서 내가 이해한 것은 


1. URL을 리소스 위주로 명시하자.

회원 가입 :  /register 이 아닌 /users(post로)

2. json을 사용하자


이정도...

뭔가 알아내면 더 추가해야지.. 지금은 머리속이 너무 복잡하다.

# 5.24 추가
1.내가 내린 Restful API의 결론은 자원을 직관적으로 표기하는 것
2.그리고 JSON을 활용하는 것(되도록)

1을 위해서 URL을 최초에 설계할 필요가 있어 보임.
2의 경우 Spring에서 ModelAndVIew가 해결해준다고 하니 일단 이러한 방식으로 접근해봐야겠다.

# 5.25 추가
스프링 4.0부터는 Rest방식을 지원하기 위해 @Restcontroller를 지원함
기존에 json 통신을 위해 @responsebody 등을 해줘야 했던 것에서 탈피하여 컨트롤러 하나를 통채로 사용할 수 있는듯.



회원 가입 기능 구현


0. 로직

- 클라이언트로부터 input 값을 받음 

-  dispathcer가 컨트롤러로 분산

- annotation에 의해 vo에 매핑

- 받은 값(vo)를 dao로 전달

- dao를 통해 insert


큰 순서는 이러하고 이를 위해서 사전에 몇가지 해줘야 하는 작업이 있다.


첫번째론 dataSource와 mybatis-config.xml을 연결해줘야한다.

mysql과 연결만 되어있을뿐 이를 위한 쿼리, 타입 등의 설정을 해줘야 한다.

그래서 mybatis-config.xml(타입과 매퍼 연결), mapper.xml(쿼리문 작성) 을 해줘야 한다.


1. 클라이언트 input


form 태그를 이용하여 action에 주소값만 설정해주면 된다.

단 input 태그로 전달되는 값과 vo를 매핑하기 위해선 input 태그의 name 속성의 이름을 vo 클래스와 동일하게 맞춰야 한다.

vo에 String apple 이라는 변수가 있고 이를 연결해준다면 input 에도 역시 name = "apple" 라고 해줘야 알아서 매핑이 된다.


2. dao

이번 프로젝트에선 biz를 생략했다. 지난번 프로젝트에서도 거치는 관문 용으로만 사용하여서.

아마 필요로 하면 통합형으로 하나 만들 것 같다.

dao로 바로 보내면 sqlsessionfactory로 연결을 하고 mapper를 이용하여 insert 하면 된다.

지난번에 마무리 못했던 탐색트리 뒷 이야기. 

1. AVL 트리

2. 2-3트리, 레드블랙트리

3.B-트리 등


복습

이진탐색트리

- 이진 탐색 개념을 트리 형태에 접목시킨 자료구조.

- 삽입, 삭제 역시 이진 탐색을 바탕으로 진행된다.

(왼쪽, 오른쪽으로 들어가기만 하면 된다)


1. AVL 트리

- 이진탐색트리를 발전 시킨 개념이다.

- 기존의 이진탐색은 값을 나누기만 할뿐 모양에 대한 고려가 없다. 즉 한쪽으로 치우치는 트릭 나올 수 있음

- 그렇기에 AVL 트리는 balence를 통해 트리의 균형을 잡는다.

- 정의 : 임의의 노드 n에 대하여 n의 왼쪽 서브트리의 높이와 오른쪽 서브트리의 높이 차이가 1을 넘지 않는 이진 탐색 트리.

- 위의 조건 때문에 AVL 트리의 높이는 피보나치 점화식으로 계산 가능.

- 균형을 위해 회전 연산을 한다.


위는 오른쪽으로 균형을 맞추는 코드의 예시

def rotate_right(self, n):

x = n.left

n.left = x.right

x.right = n

n.height = max(self.height(n.left), self.height(n.right)) + 1

x.height = max(self.height(n.left), self.height(x.right)) + 1

return x

위 그림에서는 return x를 표시 안했는데 무조건 return x를 해줘야 루트가 x로 바뀐다.


- left도 마찬가지..

- AVL 트리는 삽입 후 서브트리의 차를 바탕으로 1보다 크면 왼쪽으로 회전을, 1보다 작으면 오른쪽으로 회전을 시켜준다


2. 2-3트리, 레드블랙트리

2.1) 2-3트리

- 차수(자식)이 2인 노드가 2-노드, 차수가 3인 노드가 3-노드 라 부른다

- 모든 이파리가 동일한 층에 있어야 한다.

- 그렇기에 2-3트리는 포화이진트리이다


2.2) 레드블랙트리

- 노드의 색을 부여해서 트리의 균형을 유지한다.

- AVL 트리의 경우 알고리즘을 통해 규형을 유지한다면 레드블랙은 이러한 알고리즘을 색이라는 제약조건을 통해 구현한다.

- 책에 나와있는 것은 좌편향 레드블랙트리(좀더 단순화된 버젼인듯)

- 루트와 None은 블랙

- 루트로부터 각 None 까지 2개의 연속된 레드 link는 없다

- 루트로부터 각 None까지의 경로에 있는 블랙 link 수는 모두 같다

- 레드 link는 왼쪽으로 기울어져있다

- 이러한 조건을 통해 균형을 유지한다.


3. B-트리

- 다방향 탐색이 가능한 완전 균형 트리..

- 다양한 DBMS 시스템의 기본 자료구조로 활용된다고 한다..

- 어렵다...






Java, Spring 웹 서비스 개인 프로젝트.

목표 : 기본 기능 구현

- 회원가입

- 로그인

- 파일 업로드

- 게시판


지난번에 못했던 것 위주로 진행.

제일 처음에 환경 설정 하는 것부터 시작.


0. 개발환경

- jdk 1.8

- Eclipse oxygen

- tomcat 8.5

- Mysql 5.7버젼


1) java 설치의 경우

jdk가 jre를 포함 하고 있기 때문에 jdk만 설치하였음.


2) Eclipse는 안전하게 oxygen..


3) tomcat은 8.5버젼, 이유는 지난번에도 이것을 썻기 때문.

tomcat은 인스톨러로 설치 한 후에 윈도우에서 서비스를 꺼놔야 편함

(그렇지 않을 경우 매번 끄고 프로젝트를 진행해야해서 에러 마주칠 확률이 큼)


4) mysql은 8.0으로 설치해서 진행했는데

스프링에서 드라이버 연결시 에러가 발생.. cashing sh 관련 에러인데, 권한이랑 비밀번호 관련 문제 인듯 함.

이 문제를 해결하니 cashing size 에러가 발생해서 그냥 다운 그레이드로 하기로.


5) 지난번에는 다이나믹 웹프로젝트로 생성한 후 maven으로 변경을 시켰음. 

이번에는 spring legacy project를 통해서 바로 maven template를 적용함

- 이렇게 하고 나니 깔금하게 잘 정리되서 나와서 좋았음.

- 제일 중요한건 log4j를 붙여준다라는 점.

(이거 설정할때 너무 힘들었어서.. 아직도 잘 모르겠음)


5-1) 물론 설정파일들이 서로 연동된다는 사실을 모르면 안되므로 기존에 했던 방식이 필요로 하긴 했지만

이번에 할때는 새로운 방식으로 하기로.


6) mysql 연동시


6-1) connector를 다운 받아서 붙여줘야함.

이는 불필요할 수도 있음.

이를 하는 이유는 이클립스 상에서 sql을 조작하기 위함임.

maven은 라이브러리를 porm.xml로 붙이기 때문에 crud가 가능함.

다만 우리가 DB를 설계한 후에 바로 생성하기 위해서, 또는 조작하기 위해서 매번 cmd를 킬 순 없으니 connector를 사용


6-2) connector를 build path로 설정을 해놔야 database 연결시 드라이버가 사용 가능 하다.


'자바' 카테고리의 다른 글

3회차) 첨부파일 업로드 기능  (0) 2018.06.04
번외) No junits test found  (0) 2018.05.31
3회차) 게시판을 만들자  (0) 2018.05.24
2.5회차, RestFul api에 대한 고민  (0) 2018.05.21
2회차 회원 가입 기능 구현  (0) 2018.05.21

5월 17일

no_continuous함수는 스트링 s를 매개변수로 입력받습니다.

s의 글자들의 순서를 유지하면서, 글자들 중 연속적으로 나타나는 아이템은 제거된 배열(파이썬은 list)을 리턴하도록 함수를 완성하세요. 예를들어 다음과 같이 동작하면 됩니다.

s가 '133303'이라면 ['1', '3', '0', '3']를 리턴 s가 '47330'이라면 [4, 7, 3, 0]을 리턴


위에 처럼 코드를 썻는데,

항상 파이썬 할때 헷갈리는건 매개인자가 "" 인 경우 str이어도 list로 처리 가능?!

그래서 굳이 list로 변환 해줄 필요가 없다.


연속되는 두개만 확인하면 되기에 for문을 돌면서 i, i+1을 비교했다.

이런 문제 풀때마다 느끼는 거는 list out of range문제 ㅡ,.ㅡ 그래서 종료 조건도 추가..


고수 정답:(드래그 하면 보임)
[s[i] for i in range(len(s)) if s[i] != s[i+1:i+2]]


놀라울 뿐이다. 저렇게 인덱싱 하는게 대단함.


5월 18일 금요일

getMiddle메소드는 하나의 단어를 입력 받습니다. 단어를 입력 받아서 가운데 글자를 반환하도록 getMiddle메소드를 만들어 보세요. 단어의 길이가 짝수일경우 가운데 두글자를 반환하면 됩니다. 예를들어 입력받은 단어가 power이라면 w를 반환하면 되고, 입력받은 단어가 test라면 es를 반환하면 됩니다.






이 역시 크기 계산 후 짝수, 홀수에 따라서 i, i+1로 리턴.

최대한 람다를 활용하려고 노력함.

람다식으로 변환 계속 해보려 노력중.

한가지 알게 된 점은 위에 처럼 코드를 치면 쟤는 람다 함수가 되서 return에 함수처럼 인자를 직접 넣어줘야한다 

+ Recent posts