공부 기록/내배캠Java_5기

[내배캠][TIL] 18일 차 - 목요일, 발표 준비?

노루동산 2024. 5. 9. 21:56
반응형

 

 

📢 오늘의 목표 📢

✔️ 알고리즘, SQL 문제 풀이
✔️ 알고리즘 코드카타
✔️ SQL 코드카타
✔️ 프로그래머스 Level 2

✔️ Java 팀 프로젝트
✔️ 리팩토링
✔️ 발표 준비하기

✔️ 스프링 공부: 4장 끝

 

 

⏱️ 오늘의 일정 ⏱️

9:00 ~ 10:00 - 알고리즘 코드카타
10:00 ~ 11:00 - 팀 프로젝트 리팩토링
11:00 ~ 12:00 - 팀 회의
12:00 ~ 13:00 - 팀 프로젝트 발표 준비

13:00 ~ 14:00 - 점심시간
14:00 ~ 15:00 - 팀 프로젝트 발표 준비
15:00 ~ 16:00 - Java 심화반 수업

16:00 ~
18:00 - 팀 프로젝트 발표 준비
18:00 ~ 19:00 - 저녁 시간
19:00 ~ 20:00 - 스프링 공부
20:00 ~ 21:00 - TIL 작성

 

 

📜 Chapter 1. 알고리즘 문제 풀기

✔️ 알고리즘 코드카타

문자열을 정수로 바꾸기

 

CodingTest_AutoSave/프로그래머스/1/12925. 문자열을 정수로 바꾸기 at main · MetroDefro/CodingTest_AutoSave

모든 코딩 테스트 자동 저장. Contribute to MetroDefro/CodingTest_AutoSave development by creating an account on GitHub.

github.com

 

✔️ SQL 코드카타

DATETIME에서 DATE로 형 변환

 

CodingTest_AutoSave/프로그래머스/2/59414. DATETIME에서 DATE로 형 변환 at main · MetroDefro/CodingTest_AutoS

모든 코딩 테스트 자동 저장. Contribute to MetroDefro/CodingTest_AutoSave development by creating an account on GitHub.

github.com

 

✔️ 프로그래머스 Level 2

괄호 회전하기

 

CodingTest_AutoSave/프로그래머스/2/76502. 괄호 회전하기 at main · MetroDefro/CodingTest_AutoSave

모든 코딩 테스트 자동 저장. Contribute to MetroDefro/CodingTest_AutoSave development by creating an account on GitHub.

github.com

 

할인 행사

 

CodingTest_AutoSave/프로그래머스/2/131127. 할인 행사 at main · MetroDefro/CodingTest_AutoSave

모든 코딩 테스트 자동 저장. Contribute to MetroDefro/CodingTest_AutoSave development by creating an account on GitHub.

github.com

 

매일 꾸준히 두 문제씩 풀었더니 첫 페이지 완료!

 

 

📜 Chapter 2. 팀 프로젝트

✔️ 리팩토링

DataRegistry 분담하기 작업은 결국 하지 않았다.

사용하지 않는 코드를 없앤 것 만으로도 100줄은 줄었기 때문이다.

어차피 search 메소드들도 반환값이 다 다르기 때문에 오버라이딩도 별로 활용할 수가 없다.

 

그래도 코드 정리를 좀 한 것 만으로도 이전보다 많이 나아졌다는 느낌이다.

인텔리제이에서 띄워주는 노란 줄, 커밋할 때 뜨는 경고 문구들이 개선 작업에 도움이 됐다.

 

✔️ 발표 준비하기

사다리 타기로 발표자를 정해서 다행히 나는 발표를 하지 않는다!

그러나 팀장된 도리로 PPT를 만드니 오늘 개인 공부를 할 시간이 없었다.

PPT를 예쁘게 만들기 위해 디자인 감각 하나도 없는 내가 열심히 시간을 투자했으니 말이다.

 

그럼에도 불구하고 가장 어려웠던 점은 API 명세서를 작성하는 것.

서버를 만든 것도 아닌데 어떻게 만들라는 거지?

튜터님께 찾아가보니 API 형식에 너무 얽메이지 말고 사용설명서를 만든다고 생각해보라 하셨다!

 

 

📜 Chapter 3. 스프링 찍먹

✔️ 4-06 서버 스크립트 생성하기

저번에 사용했던 방식으로 서버를 실행하면 터미널 프로그램을 종료할 경우 서비스도 중단된다. 즉 백그라운드로 서비스를 실행해야만 하는 것.

 

서버에서는 IDE를 사용할 수 없기 때문에 나노 편집기( 리눅스 기반 OS에서 사용할 수 있는 간단한 터미널 텍스트 편집기 )를 사용해야 한다.

서버 디렉토리로 이동해 nano start.sh 명령어로 나노 편집기를 실행한다.

#!/bin/bash

JAR=JumpToSpringBoot-0.0.1-SNAPSHOT.jar
LOG=/home/ubuntu/sbb/sbb.log

nohup java -jar $JAR > $LOG 2>&1 &

외계어 입력하기. 내용 설명에 대해서도 책에는 적혀있는데 바로 머리에 들어오지 않아서 읽고 흘렸다.

 

chmod +x start.sh 커맨드를 입력해 스크립트명만으로도 실행될 수 있도록 권한을 부여한다.

chmod는 'change mode'의 줄임말로, 파일의 권한 모드를 변경하라는 뜻이다. +는 권한을 추가한다는 뜻이고, x는 실행할 수 있는 권한을 뜻한다.

./start.sh 로 백그라운드로 서버 실행

 

이제 서버를 중지하는 스크립트도 필요하다. 방금과 동일하게 nano 편집기를 이용한다.

#!/bin/bash

SBB_PID=$(ps -ef | grep java | grep sbb | awk '{print $2}')

if [ -z "$SBB_PID" ];
then
    echo "SBB is not running"
else
    kill -9 $SBB_PID
    echo "SBB stopped."
fi

종료 스크립트는 이렇다. 방금과 같이 권한을 부여하고 ./stop.sh로 자유롭게 종료하고 다시 실행하자.

 

✔️ 4-07 서버 환경으로 분리하기

서버 환경과 개발 환경을 분리하고 서버 환경에서는 DB에 비밀번호를 설정해 보안을 강화하자.

스프링 부트는 시작 옵션으로 spring.profiles.active 항목을 전달할 수 있다.  -Dspring.profiles.active=prod 옵션을 주어 실행하면 스프링 부트는 application.properties 파일 대신 application-prod.properties을 사용한다.

 

리소시스 폴더 -> application-prod.properties파일 생성

spring.h2.console.settings.web-allow-others=true
spring.datasource.password=1234

여기서는 비밀번호를 설정하고, 외부에서도 H2 콘솔에 접근할 수 있게 하였다.

 

관리가 용이하도록 build.gradle의 빌드의 버전을 바꾸고 빌드를 진행하자.

서버를 실행하고 파일질라에 배포파일을 업로드하자.

 

데이터베이스에 비밀번호를 설정했기 때문에 기존에 있던 데이터베이스 파일을 지워야 한다.

ubuntu@jumpto:~$ ls
local.mv.db  sbb
ubuntu@jumpto:~$ rm local.mv.db

그리고 다시 start.sh 파일 수정...

#!/bin/bash

JAR=sbb-0.0.2.jar
LOG=/home/ubuntu/sbb/sbb.log

nohup java -Dspring.profiles.active=prod -jar $JAR > $LOG 2>&1 &

당장은 알겠는데 10분만 지나도 까먹을 것 같은 명령어들...

새로 업로드한 sbb-0.0.2.jar를 적용하고 -Dspring.profiles.active=prod 옵션을 주어 스프링 부트가 실행되도록 설정했다.

고한다.

많이 쓰면 익숙해지겠지...깃처럼...ㅠㅠ

잘 됐나 확인해보려니 위험하다고 막고있다 ㅋㅋ

안되겠다... https로 바꾼 다음에 다시 시도해보자...

 

✔️ 4-08 80번 포트로 웹 서비스 운영하기

엔진엑스(Nginx)나 아파치(Apache)와 같은 웹 서버를 사용해 80번 포트로 웹 서비스를 제공해보자.

벌써 까는 프로그램이 세 개째인데 이것들에 대해서 자세히 설명해주진 않아 답답하다.

sudo apt install nginx

MobaXterm에서 이 명령어를 입력해 엔진엑스를 설치할 수 있다.

ubuntu@jumpto:~$ cd /etc/nginx/sites-available/
ubuntu@jumpto:/etc/nginx/sites-available$ sudo nano sbb

그리고 해당 폴더로 이동해 설정 파일을 생성했다.

server {
        listen 80;
        server_name localhost;

        location / {
                proxy_pass http://localhost:8080;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
        }
}

이 코드는 웹 서버를 80번 포트로 서비스하며, URL에서 포트 번호를 생략해도 접속할 수 있다는 뜻이다.

다만 ip와 연결된 도메인을 구입하지 않았기에 server_name에는 localhost를 입력했다.

location / { }은 클라이언트 요청에 대한 설정을 담당하는 영역이다.

  • proxy_pass: 엔진엑스(nginx) 웹 서버가 받은 모든 클라이언트 요청을 http://localhost:8080으로 리다이렉트한다.
  • proxy_set_header: 브라우저에서 SBB 서비스를 호출하면 엔진엑스를 통해서 스프링 부트(Spring Boot)의 톰캣(Tomcat) 서버로 요청이 전달된다. proxy_set_header 설정은 이 과정에서 클라이언트의 주소가 실제 IP 주소가 아닌 엔진엑스가 설치된 서버의 주소로 톰캣 서버에 전달되는 것을 방지하기 위해 사용한다.

나도 지금 30퍼센트 정도만 이 말을 이해하고 있다...

 

이제 작성한 sbb 파일을 엔진엑스가 SBB 서비스의 설정 파일로 읽을 수 있도록 sbb 파일을 /etc/nginx/sites-enabled 디렉터리에 링크해야 한다. 일단 해당 디렉터리로 이동하자. 이제 디렉터리 이동은 잘 한다. ^^

기본 default 파일이 있을텐데 삭제한다. (삭제도 잘 한다 ^^)

그리고 /etc/nginx/sites-available/sbb 파일을 /etc/nginx/sites-enabled/sbb 파일로 링크한다.

sudo ln -s /etc/nginx/sites-available/sbb

 

그리고 엔진 엑스 재시작.

sudo systemctl restart nginx

 

접속 성공!

 

✔️ 4-09 로그 관리하기

스프링 부트는 기본적으로 로그백(Logback)이라는 로깅 도구를 사용하여 로그를 관리한다.

그러나 현재 서버에서 생성되는 로그는 몇 가지 문제가 있다.

  • SBB 서비스를 다시 실행할 경우(즉, stop.sh를 하고 start.sh를 실행할 경우) 이전 로그가 삭제된다.
  • 로그가 쌓일수록 로그 파일의 용량이 커지며 무한대로 증가할 수 있다.
  • 로그 시간이 시스템 시간이 아닌 UTC 시간으로 출력된다.
# logging
logging.logback.rollingpolicy.max-history=30
logging.logback.rollingpolicy.max-file-size=100MB
logging.file.name=logs/sbb.log
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}-%i.log
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS,Asia/Seoul

application-prod.properties 파일에 다음과 같이 로깅 설정을 추가하자.

  • logging.logback.rollingpolicy.max-history: 로그 파일을 유지할 기간(일수)을 설정한다. 여기서는 30일 간의 로그만 유지하도록 했다.
  • logging.logback.rollingpolicy.max-file-size: 로그 파일 1개의 최대 용량(size)를 설정한다. 여기서는 100MB로 설정했다.
  • logging.file.name: 로그 파일의 이름을 설정한다. 여기서 logs/sbb.log는 logs 디렉터리의 하위에 sbb.log라는 이름으로 로그 파일을 생성하라는 의미이다.
  • logging.logback.rollingpolicy.file-name-pattern: 로그 파일의 용량이 설정한 용량을 초과하거나 날짜가 변경될 경우 새로이 만들어질 로그 파일의 이름에 관한 규칙(pattern)을 설정한다.
  • logging.pattern.dateformat: 로그 출력 시 출력하는 날짜와 시간의 형식과 타임존(time zone)을 설정한다. 여기서는 Asia/Seoul로 설정했다. 만약 타임존을 설정하지 않을 경우 UTC 시간을 기준으로 출력한다.

또 수정을 했으니 빌드 버전을 변경하고, 빌드하고, 배포하자.

LOG=/dev/null

start.sh 파일로 가서 빌드 버전을 수정해주고 LOG를 이와 같이 변경했다.

logs 디렉터리 하위에 로그 파일(sbb.log)이 생성되도록 설정했기 때문.

ubuntu@jumpto:~/sbb/logs$ ls
sbb.log

그리고 다음과 같이 logs 디렉터리가 생성되고 밑에 sbb.log파일이 생긴다는데 난 안 생긴다 왜지?

솔직히 이 파트 잘 모르겠어서 디버깅 할 엄두가 안나 그냥 넘어갔다.

 

사용자 로그 작성

@Slf4j
// ...
public class QuestionController {
	// ...
    @GetMapping("/list")
    public String list(Model model, @RequestParam(value = "page", defaultValue = "0") int page, 
            @RequestParam(value = "kw", defaultValue = "") String kw) {
        log.info("page:{}, kw:{}", page, kw);
        Page<Question> paging = this.questionService.getList(page, kw);
        model.addAttribute("paging", paging);
        model.addAttribute("kw", kw);

        return "question_list";
    }
	// ...
}

얼마만에 보는 자바 코드야!

롬복의 @Slf4j애너티이션을 사용하면 log 객체를 사용할 수 있다.

debug, error 등 로그 레벨로 로그를 출력할 수 있다. 아 유니티 언리얼 로그랑 비슷하네~

  • trace(1단계): 가장 낮은 로그 레벨이며, debug보다 정보를 훨씬 상세하게 기록할 경우에 사용한다.
  • debug(2단계): 디버깅 목적으로 사용한다.
  • info(3단계): 주요 이벤트나 상태 등의 일반 정보를 출력할 목적으로 사용한다.
  • warn(4단계): 문제가 발생할 가능성이 있는 상태나 상황 등(비교적 작은 문제)에 관한 경고 정보를 출력할 목적으로 사용한다.
  • error(5단계): 심각한 문제나 예외 상황 등(비교적 큰 문제)에 대한 오류 정보를 출력할 목적으로 사용한다.
  • fatal(6단계): 가장 높은 로그 레벨이며, 프로그램 기능의 일부가 실패하거나 오류가 발생하는 등 아주 심각한 문제에 관한 정보를 출력할 목적으로 사용한다.

application-prod.properties 파일에 logging.level.root=info로 설정하면 INFO 이상의 로그만 출력되며, 이게 기본값이다.

 

✔️ 4-10 도메인 사용하기

일단 도메인을 사려면 연 1~3만원의 비용이 들기 때문에! 실습은 진행하지 않을 것이다.

 

구입에 앞서 사용할 수 있는 도메인인지 확인해야 한다.

https://whois.kr 여기서 확인 가능하다.

 

KISA 후이즈검색 whois.kisa.or.kr

한국인터넷진흥원 인터넷주소자원 검색(후이즈검색) 서비스 입니다.

xn--c79as89aj0e29b77z.xn--3e0b707e

 

AWS에서도 도메인을 판매한다.

https://console.aws.amazon.com/route53/home

 

https://us-east-1.console.aws.amazon.com/route53/home

 

us-east-1.console.aws.amazon.com

 

이 외에도 도메인을 판매하는 사이트는 여럿인듯 보인다.

 

라이트 세일 aws의 도메인 및 DNS메뉴에서 도메인과 고정 IP를 연결한다.

그리고 방법을 설명해주고 있는데... 방법 찾기야 나중에도 쉬울 테니 눈으로만 훑고 넘어갔다.

 

마지막으로 웹 서버의 설정을 변경해야 도메인을 적용할 수 있다.

server {
        listen 80;
        server_name pybo.kr;

        location / {
                proxy_pass http://localhost:8080;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
        }
}

server_name에 도메인을 적용한다.

 

✔️ 4-11 HTTPS로 전환하기

https에 대한 설명은 다른 곳에서 몇 번이고 들었다. 계속 주의가 뜨고 있기 때문에 https로 바꿔보자.

그러나 대표적인 인증 기관에서 인증서를 발급 받으려면... 유료이다.

다행히 Let’s Encrypt 서비스를 이용해 무료 인증서를 발급받을 수 있다!

유료 인증서는 인증 기관에서 보안 사고 시 배상금을 지급한다...

 

이 Let's Encryt SSL 인증서를 쉽세 생성하고 관리할 수 있게 certbot과 python3-certbot-nginx를 설치해야 한다.

certbot은 SSL 인증서를 생성, 발급, 갱신, 관리하는 데 사용한다. python3-certbot-nginx는 certbot을 엔진엑스(nginx) 웹 서버와 함께 사용하려면 필요하다.

ubuntu@jumpto:~$ sudo apt install certbot
ubuntu@jumpto:~$ sudo apt install python3-certbot-nginx

 

그런데 또 진행하다 보니가 도메인이 있어야 발급할 수 있는 것 같다.

이럴 수가...

 

아쉽지만 https로 만드는 것도 포기했다.

 

✔️ 4-12 PostgreSQL로 전환하기

이 데이터베이스도 AWS 라이트세일을 이용할 수 있는데 한 달 15달러정도 든다고 한다...

정말 선뜻 사보기엔 아무리 무료체험 기간이 있다고 해도 손이 잘 가지 않는다.

서버 한 달 7달러면 다 되는 줄 알았는데!!!!!!

 

그래서 어쩔 수 없이 이것도 포기했다.

 

✔️ 끝!?

그래도 스프링을 공부하는 부분은 완주했으니! 뿌듯해하고 자랑스러워 하자.

아직 스프링에대해 잘 안 다고는 할 수 없다. 말 그대로 찍먹 정도였던 것 같다.

그래도 스프링 주차에 들어 가기 전에 맛 보기 정도론 괜찮았다고 생각한다.

 

 

📜 Chapter 4. Java 심화반 수업

✔️ Primitive Type: 원시형 타입

객체가 아니다!

  • 반드시 사용하기 전에 선언 되어야 한다. (하지 않을시 기본값)
  • stack 영역에 저장된다.
  • 실제 값이 저장된다.
  • 데이터를 공유하지 않는다.

 

✔️ Reference Type: 참조형 타입

원시타입 말고 다!

  • Object 타입을 상속받는 모든 클래스
  • heap 영역에 저장된다.
  • 실제 값이 아닌 객체의 주소(참조)값이 저장된다. (사용되지 않으면 GC에 의해 메모리에서 제거된다.)
  • stack 영역에는 참조의 포인터가 저장된다.

 

✔️ 불변 객체(Immutable Object) & 가변 객체(Mutable)

객체가 가지고 있는 필드가 변하지 않는 객체

공유된 참조 객체의 값을 변경하지 못하게 설계

기존 참조 객체를 수정 가능한 클래스는 가변 객체라 한다.

 

필드에 final을 사용하여 생성자만 값을 설정할 수 있게 한다.

public class ImmutableReference {

    private final String name;

		// 생성자
    public ImmutableReference(String name) {
        this.name= name;
    }

    public String getName() {
        return name;
    }

    // final 키워드로 값의 변경이 불가능하여 해당 메서드 사용불가
    // public void setName(String name) {
    //     this.name = name;
    // }

}

setter가 없는 객체를 불변 객체라 한다.

 

불변객체를 변경해야 할 때

withOO 메서드 사용: 메서드 내에서 새로운 불변객체를 생성해서 반환한다.

public class ImmutableReference {

    private final String name;

		// 생성자
    public ImmutableReference(String name) {
        this.name= name;
    }

    public String getName() {
        return name;
    }

    // 새로운 객체를 생성하여 반환 한다.
    public ImmutableReference withName(String name) {
	    return new ImmutableReference("name");
    }

}

 

장점: 불변 객첼르 사용하면 인스턴스에 대한 신뢰도가 생긴다. Thread-safe 하다.

단점: 불변 객체에 새로운 값이 필요할 때 마다 새로운 객체가 생성된다.

 

✔️ String 불변 객체
  • String은 참조형에 속하지만 기본형처럼 사용한다.
  • String, 그리고 Integer같은 다양한 클래스들이 불변 객체로 만들어져있다.
  • 가변 String객체가 필요하면 StringBuilder를 사용한다.
  • String의 값을 변경하는 것 같아 보여도 사실 새로운 String 클래스 객체를 만들어내는 것이다.

 

스트링에 대해 알고 있다면 DTO에 대해 깊~게 찾아보자.

 

 

🌙 오늘을 마치며 🌙 

팀프도 발표만 남았고 스프링 책 하나도 끝냈다.

그럼 이제 뭐 하지?

 

다음 주차에 스프링이 시작되니 뭐 할 시간이 없긴 하지만...

그래도 내일은 "스프링 입문을 위한 자바 객체 지향의 원리와 이해"를 읽어보려 한다.

사실 이미 여가 시간에 3장까지 읽었다. 아직 자바, 객체지향의 기본에 대한 이야기라 막히는 것은 없었다.

 

그리고 스프링 무료 입문 강의도 찾아두었다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

 

[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 | 김영한 - 인프런

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확

www.inflearn.com

 

그리고 또... 스프링은 "토비의 스프링"이라는 책이 유명하단 것도 찾았다.

 

난 공부할 게 눈에 보이면 다행이라는 생각이 든다.

다행이다.

반응형