tuter77

2022.12.16 TIL 본문

TIL

2022.12.16 TIL

tuter77 2022. 12. 16. 12:48

<git>

 

git 강의가 끝나고 실습에서 생성했던 repository가 어지럽혀져 있어 정리하는 과정을 가졌다.

https://velog.io/@ejayjeon/Github-Repository%EB%93%A4-%EA%B9%94%EB%81%94%ED%95%98%EA%B2%8C-%ED%95%98%EB%82%98%EB%A1%9C-%ED%95%A9%EC%B9%98%EA%B8%B0

 

[Github] Repository들 깔끔하게 하나로 합치기

github 로그인 > Your Repositories 에 들어가면 내가 만들거나 속해있는 레포지토리들을 확인할 수 있습니다. New 버튼을 눌러 기존의 레포지토리들을 합칠 새로운 레포지토리를 생성합니다.저는 Project

velog.io

이 블로그를 참조하여 레포들을 한 레포의 하위레포들로 모았고 합치고 난 후에는 일일히 남아있는 레포들을 삭제하는 과정을 거쳤다.

 

먼저 레포를 합치려면, 다른 레포들이 들어갈 레포를 하나 생성하고(내 경우엔 git_study로 만듦), 코드 에디터에서 해당 레포를 클론했다.

 

git clone (url)

 

그 후 클론한 레포의 폴더가 생성이 되면, 합칠 레포들을 명령어로 일일히 입력해줘야하는데 사용하는 명령어는 아래와 같다.

 

git  subtree add --prefix= 레포명 레포주소 해당 브랜치명 

 

이 명령어를 이용하면 새로 만든 레포 안의 하위 레포로 넣을 수 있는데, 내 경우엔 커밋로그가 없어 계속 fatal 오류가 났었다. 

 

몇 번의 시도끝에 커밋 로그가 없어서 안된다는 걸 알게되어, readme 파일을 간단히 만들어 add, commit 해준 뒤에는 정상 작동했다.

 

각 하위 레포들을 모두 명령어로 입력해주고 나면, 깃허브 사이트에서 확인할 수 있는데 기존의 레포들이 그대로 있고, 새로 만든 레포 안에도 하위레포가 형성되어있는것을 볼 수 있다. 

 

혹시 각 레포가 연동이 되어있나 하나씩 지워보니 연동이 되지 않았음을 알 수 있었고, 나는 일일히 밖에 나와있는 하위레포들을 지웠다.

 

지우는 과정에서는 settings에 들어가 가장 아래쪽에 delete항목이 있는것을 확인할 수 있다. 

 

*(번외로 이번에 레포를 정리하고 난 후 폴더경로가 틀어져 main으로 push, pull이 되지않는 참사가 일어났다.

학습할때엔 바탕화면에 폴더를 만들고 저장해, 바로 push해서 레포에 넣었었는데 레포지토리 정리를 하고난 후 바탕화면의 폴더들도 다 workspace라는 한 폴더를 지정해 넣었더니 에러가 계속 발생했다.

 

과거에 공부했던 레포들도 remote는 되었으나, pull이 되지않아 당황했었는데 방법을 못찾아 결국 폴더 밖으로 기존 폴더들을 다 빼내어버렸다.(그랬더니 pull이 되었다.)

또한 push나 pull request도 되지않았는데, 강제로 푸쉬를 하는 git push 주소 main --force를 활용해 해결했다.(강제푸쉬한 레포에는 별 파일이 없어서 가능했다.)

pull request의 경우 강제로 푸쉬해서 해결했지만, PR작성이 되지 않는 원인을 여전히 모르겠다. 연결상의 문제였는지, 경로가 차이가 나서 그랬던건지 모르겠다. 

지금은 다시 잘된다.) 

 

 

<Spring Framework>

 

java도 끝나기 전 조금 진도가 이르지만, 스터디그룹에서 사이드 프로젝트를 결정하기 위한 기본개념이 너무 부족해 팀원들과 각각 기본개념들을 공부해오기로했다.

총 3가지 주제가 있었는데, myBatis/JPA 개념, 차이, 장단점이 있었고, Spring/Spring Boot  개념, 차이, 장단점. CSR/SSR의 개념, 차이, 장단점이 있었다.

 

이 중 나는 여러 채용공고에서 spring framework 사용 개발경험이라는 항목을 굉장히 많이 봤는데, 도대체 스프링이 무엇인지 궁금해서 내가 맡게 되었다.

 

스프링에 대해 간략하게 소개된 글을 다양하게 검색해서 읽었는데 10개면 10개 모두 듣도보도 못한 개념들로 꽉차있어, 내용을 알아보기가 힘들었다.

애시당초 나는 라이브러리와 프레임 워크의 차이점에 대해서도 잘 알지 못하는 상황이라 팀장에게 급히 물어봐야만했다.

 

간단하게 요약하면 프레임 워크는 여러 필요한 라이브러리들이 포함되어있는 더 큰 템플릿(틀)이었다.

그렇다면 프레임워크는 큰 틀과 같다는 개념을 바탕에 깔고 글들을 다시 읽자 조금이나마, 눈에 들어오기 시작했다.

그러나 스프링이라는게 여러 기능을 가지 템플릿이라는건 알겠다만, 핵심 기능이라고 나온것들은 따로 찾아볼 수 밖에 없는 것들이었다. (특히 DI, IoC 와 같은 것들)

 

결국 그냥 스프링 강의를 수강하기 시작했다.

 

개념부터 정리하자면 스프링, 스프링 부트는 모두 객체지향적 프로그래밍 언어인 자바로 만들어진 프레임 워크이며, 자바가 웹서버에서 구동하기가 워낙 사용하기 불편했던 탓에 만들어진 것이라고 한다.(자바의 겨울이지나 봄이왔다고 해서 스프링이라고 지었다고 한다.)

 

스프링은 자바를 이용해 어플리케이션을 만들려고 활용하는 여러 툴이 활용된 프레임워크, 스프링 부트는 스프링을 모두 비슷하게 활용하자 더 편리하게 사용하려고 만든 상위 프레임 워크다.(사용자에게 가까운)

비유하자면 스프링은 스틱기어고, 스프링부트는 오토기어쯤 된다고 한다.

 

스프링에서 웹 서버와 소통하기 위해선 아파치 서버, 톰캣등의 웹 어플리케이션이 필요했는데 이 톰캣 세팅이 워낙 어렵다보니 스프링 부트에서는 톰캣을 자동으로 설정해주게끔 서버에 내장을 해버렸다.

때문에 컴퓨터 부팅하는 것과 같다고 해서 스프링 부트로 이름을 지었다고 한다.

 

스프링의 장점은 다양하게 있다. 

먼저 모든 기능에서 다양한 모듈을 사용가능한 자유도를 자랑한다.(심지어 외부 모듈까지 가능하다고 한다.)

계속해서 개발중이며, 이전 버전들과 높은 호환성을 가졌다.

또한 API디자인을 섬세하게 하려고 노력해, 스프링 오픈소스 자체가 좋은 참고가 된다.

앞서 말한것의 파생으로 높은 코드 품질을 유지하려한다.

 

반면, 단점은 장점들에서 찾을 수 있다. 

높은 자유도 때문에 좋은 툴을 선택하기 힘든 상황이 발생한다.

이전 버전과의 높은 호환성은 레거시(낡은 기술)가 많이 남아있다는 말과 같은데, 이는 코드의 복잡성이 높아지기도 한다.

 

스프링 부트는 스프링의 장점을 다 가지면서 단점을 최소화 하기 위해 내놓은 서브 프로젝트라고 한다. 

때문에 스프링 부트의 장점은 스프링과의 차이점이기도 하다.

 

첫번째로 dependency(의존성: 개념을 완전히 이해하진 못함..) 설정과 버전관리가 수월해졌다고 한다. 

스프링 부트에서는 버전관리를 자동으로 해준다. 라이브러리 추가 등을 한번에 한다던지 하는 예시가 있다.

 

두번째로 스프링의 어려운 모든 어노테이션(주석) 및 빈 등록 등의 설정을 다 해야한다는 단점을 개선해 자동configuration이 있다. @SpringBootApplication 이라는 어노테이션 덕에 많은 외부 라이브러리, 내장 톰캣 서버등이 실행될 수 있다고 한다. 이 어노테이션은 @ComponentScan을 통해 어노테이션에 붙은 객체들을 스캔해 자동으로 Bean에 등록해준다.

(Bean은 자료를 저장하는 객체로서, 스프링 Bean은 자바 Bean과 다르게 New Object로 생성하는게 아닌 Class를 생성하면 SpringApplicationContext에 의해 등록되는 형태다. 이 과정에서 스프링 설정값이 씌워진다고 함.)

 

세번째로 배포가 편리하다. 스프링으로 개발한 애플리케이션은 war파일을 WAS(Wep Application Server)에 담아 배포했는데, 스프링 부트에선 내장된 WAS가 있기때문에 jar파일로 따로 설정을 하지않고도 간편히 배포할 수 있다고 한다.

 

이렇게 스프링과 스프링부트의 개념, 장단점, 차이점을 알아봤는데 이해가 안되는 개념들이 여전히 많다. 

의존성은 라이브러리에 의존같은 개념으로 이해하면 될것 같기도하지만, 아직 핵심기능이 AOP, Validation, Data Binding, SqEL등 많이 남았기 때문에 공부를 깊게 해보아야 할것같다.

 

끝으로 왜 이렇게 이해부터 복잡한 스프링이 한국에서 그렇게 애용되는지가 궁금해 검색해 보았는데, 자바때문이었다.

한국에서 정부가 자바과정을 강력하게 추진했었고 그에대한 여파로 기업들은 자바를 애용하고 있었다. 거기다 정부인증시스템이 전부 자바로 제작되어 자바는 국내에서 필수적인 언어가 되었고, 그 여파로 프레임 워크는 스프링이 주류를 이루고 있다는 글을 읽었다. 

(그러나 글 저자도 신입개발자가 굳이 스프링을 꼭 배워야하는지에는 의문을 가졌다.)

내 입장에선 채용공고에 거의 매번 보이는 스프링을 이번기회에 꼭 독파해야겠다는 자극이 되어 좋다.

 

<java>

 

확실히 스프링에 대한 예습을 해보니 자바를 잘 배워놔야겠다는 생각이 들었다. 이 기초파트를 넘어가 실습에 들어가면 그래도 좀 더 재밌지 않을까 기대한다.

이번 강의들은 정보처리 기능사에서 모두 배웠던 내용들이라, 간단하게 개념만 짚고 넘어가려고 한다.

 

●연산자들

 

- 항과 연산자

 항: 연산에 사용되는 값

 연산자: 연산하는 기호

 

-대입 연산자 

변수에 따른 변수나 값을 대입하는 연산자(우선순위가 낮고, 계산 등의 마지막에 대입해야한다.)

num = value;와 같은 형태를 가진 식 또는 값이다.

 

- 부호연산자

단항 연산자이며 연산에서 우선순위가 가장 높다.

변수의 부호를 유지하거나 바꾼다.

실제 변수의 부호가 변하려면 대입연사자를 사용해야한다.

예시)

int num = 10;

System.out.println("-num");

변수의 부호유지 혹은 바꿔서 사용하는 용도이며, 실제 값이 -10이되려면 num = -num가 되어야하기 때문에 이 경우를 부호연산자라고한다.

 

- 산술연산자

+, -, *, /, %

mod(%)에 대해서만 따로 얘기하자면 n개의 숫자중 0 ~ n-1개가 되는 나머지라고 이해하면 된다.

예시) 5%4 = 1 

 

- 복합 대입연산자

+=, -=, *=, /=, %=, <<=, >>=, <<<=

간단히 설명하면 a += 1 은 a = a+1과 같다.

<<, >>는 쉬프트로 2진수의 위치가 변하는 것이다. 경우에 따라 값이 유실되기도, 더해지기도(뒷자리의 0이 더 붙는 경우) 한다.

 

- 증가, 감소 연산자

단항연산자로서 변수의 값을 1더하거나 뺄 때에 사용한다. 

연산자가 항의 앞에 있는지 뒤에 있는지에 따라 연산 시점결과가 달라진다.

문장(statement)의 끝을 기준으로 연산시점을 생각한다.

++ 은 항에 1을 더하는 것. --는 항에 1을 빼는것.

예시) ++i -> 1을 바로 더한다.

i++ -> 1을 연산이 끝나고 난 후 더한다.

(보통 반복문에 자주 사용된다.)

 

-관계 연산자(비교연산자)

이항 연산자이며, 연산의 결과가 true, false로 반환된다.

조건문, 반복문의 조건식으로 많이 활용된다.

<, >, <=, >=, ==, !=

== 은 컴퓨터에서 같다는 뜻이고 = 은 대입한다는 뜻이다. 

!=는 같지 않다는 뜻.

 

- 논리 연산자.

관계연산자와 혼합하여 사용하는데, 연산의 결과가 참/거짓으로 변환된다.

&& 논리합 : 두 항 모두 참일 때 true(AND)

|| 논리곱 : 두 항 중 하나의 항이라도 참일 때 true(OR)

! 부정 : 참을 거짓으로 혹은 거짓을 참으로 변환 (NOT)

 

- 단란 회로 평가

논리연산에서 모든 항이 실행되지 않는 경우를 말한다.

예시)

A && B 중 A가 false 면 B를 볼 필요 없이 false

A || B 중 A가 true 면 B를 볼 필요 없이 true

 

-조건 연산자

삼항 연산자로 조건식의 결과가 true 일 때와 false 일 때가 다른 결과를 수행한다.

if 조건문을 간단히 표현할 때 사용할 수 있다.

연산자 : (조건식) ? 결과1 : 결과2;

기능으로 조건식이 참이면 결과 1을 거짓이면 결과 2를 표현한다.

 

위의 예시로서 새로운 명령어가 등장해 기록한다.

 

콘솔에서 입력 받기위한 구문.(Scanner 활용)

 

import java.util.Scanner;

public class ConditionTest {

public static void main(String[] args) {

 

int max;

System.out.println("두 수를 입력 받아서 더 큰 수를 출력하세요\n");

 

Scanner scanner = new Scanner(System.in);

System.out.println("입력 1:");

int num1 = scanner.nextInt();

System.out.println("입력 2:");

int num2 = scanner.nextInt();

 

max = (num1 > num2)? num1 : num2;

System.out.println(max);

 

}

 

}

위와 같이 작성하게 되면, 콘솔 창에서 첫 출력문장이 출력되고, 입력 1에 num1을 입력, 입력2에 num2를 입력하여 이를 스캔한 다음 max 조건문에서 나온 결과를 출력한다.

 

알고있는 개념들이더라도 이렇게 한 번더 짚고 넘어가는게 복습이 되고 좋다.

'TIL' 카테고리의 다른 글

2022.12.19 TIL  (0) 2022.12.19
2022.12.18 TIL  (0) 2022.12.18
2022.12.15 TIL  (0) 2022.12.15
2022.12.14 TIL  (0) 2022.12.14
2022.12.13 TIL  (2) 2022.12.13