🦅Swift Syntax

어떻게 공부할 것인가?(학습방법)

msi 2021. 4. 14. 19:48

스프링 프레임워크를 왜 쓰는지를 알려면

결국 자바를 배워야 한다

디펜던시 인젝션 IoC

프로토타입

싱글톤패턴

더블체크라킹

등을 멀티스레드 환경에서 편하게 구현하기 위해

스프링에서 빈을 만들어서 포조를 사용한다

리플렉션?, 다이내믹 프록시?에 대해 들어본 적이 없다면 공부방법에 대해 의심해봐야 한다.

나잖아?ㅎㅎ


스터디는 개인주의야

스터디는 철저히 개인주의를 추구해야 한다. 절대로 남에 의해서 또는 남을 위해서도 안된다. 본인에게 필요한 책을 골라 매주 또는 격주로 자신이 습득한 내용을 남에게 설명하는 연습을 할 수 있는 최적의 방법이 스터디다. 4~5명을 상대로 내가 이해한 내용을 남들에게 설명하며, 또 남들이 설명하는 것을 내가 이해한것과 비교하는 과정을 통해 여러 효과를 얻을 수 있지만 그 중에 몇가지만 꼽자면...

1. 발표 실력 향상

2. 지식 재점검

3. 자신감 향상

'이제는 혼자 준비해서 2~300명 앞에서도 발표할 수 있겠다.'라는 자신감이 생길 때까지 꾸준히 하는 걸 추천한다. (그리고 기회가 된다면 세미나에 발표자로 참석해 보길 권장한다.)

기본이란 말그대로 자바의 기본 문법이나 주요 API와 특징을 말한다. 특히 이 글을 작성하는 시점에서 자바의 기본이라면 자바 8을 넘어 자바 11까지의 주요 기능을 학습할 것을 권장한다. 자바 8이 현재 시점에 가장 널리 쓰이고 있는 LTS(Long-Term Support) 버전이지만 자바 11로 넘어가는 추세기 때문이다. 다음 LTS 버전인 자바 17이 나오기 전까지는 시간이 좀 있으니 자바 12 이후의 기능은 다소 미뤄도 괜찮다. 현업에서 자바 17을 도입하기 까지는 아직 시간이 많이 필요하니 그보다 더 이전에 사용하게 될 자바 11이전 기술부터 확실하게 챙기는데 집중하는것이 좋다.

자바 기본 기능을 학습했다면 이제는 인텔리J 또는 이클립스와 같은 IDE(Integerated Development Environment, 통합 개발 환경) 그리고 Git과 같은 SCM(Source Code Management, 소스 코드 관리) 도구를 사용해 협업하는 방법 그리고 빌드툴을 사용해 프로젝트를 빌드하는 방법을 학습해야 한다. 현 시점에 가장 많이 쓰이는 툴 기준 (Jetbrains 2020 자바 리포트)으로 IDE는 인텔리J 또는 이클립스, SCM은 Git 그리고 빌드툴로는 메이븐 또는 그래들을 학습해야 하는데 이것들도 사실 스터디를 통해 학습할 때 효과가 좋다. 남들이 발표시 사용하는 IDE 단축키를 물어보거나, 자신이 주로 사용하는 단축키 및 Git 명령어를 공유하면서 익히면 문서를 보며 공부하는 것보다 재미도 있고 훨씬 쉽게 학습할 수 있다.


DFS 학습 방법

지금까지 본인이 학습한 자바는 자바 스탠다드 에디션 즉, JSE라고 부르는 기술의 일부에 해당하며 JEE는 JSE 기반으로 엔터프라이즈 즉 기업용 소프트웨어를 개발하는데 필요한 기술이라 생각할 수 있다. 여기에는 의존성 주입(CDI), 트랜잭션 처리(JTA), 영속화 기술 (JPA), 이메일, 서블릿, JSP, 빈(bean) 검증 등 정말 다양한 기술이 속해 있으며 아마도 대부분의 것들이 생소하게 느껴질 것이다. 생소한 개념이 갑자기 너무 많이 등장했다고 당황할 필요는 없다. 누구에게나 처음이 있다는 사실을 잊지 말자.

만들면서 배우자.

그럼 이 다양한 기술을 어떻게 학습하느냐? 하나씩 스팩(specification) 또는 레퍼런스 문서를 읽어가면서? 글쎄, 그 지루함을 견딜 자신이 있다면 그것 또한 좋은 방법일 것이다. 하지만 나처럼 무언가 동작하는 코드를 보며 학습하고 싶다면 스프링을 사용하며 자바를 익히는 방법을 추천한다. 다만, 조심해야 할 것은 스프링이 아니라 자바에 집중해야 한다는 사실을 잊지말아야 한다. 아직 이 시점에는 스프링에 집중할 필요도 없고 그럴만한 학습 수준이 아니기 때문이다. 따라서 스프링을 학습하다가 자주 JSE 또는 JEE의 문서와 API를 확인하는데 시간을 소비하는 것이 자연스러운 단계다. 이 시점에 스프링의 API와 문서를 더 자주 본다면 학습의 초점이 자바가 아니라 스프링으로 바뀌었다는 사실을 깨닫고 다시 방향을 조절해야 한다.

야크 쉐이빙(Yak Shaving)이라고 표현할 수도 있는데 야크 털을 깎으려다가 털을 깎을 도구를 다듬고 또 다시 그 도구를 다듬는데 필요한 작업을 하게 되는 , 흔히 '삼천포에 빠진다'는 말과 비슷하다. 이런 작업은 업무를 하는데 있어서는 굉장히 비효율적인 방법이지만 학습에 있어서는 조금 다르다. 스프링을 야크 삼아 자바 실력을 다듬는다고 생각하면 좋겠다.

스프링의 IoC를 학습하며 최소한 자바의 리플렉션이나 클래스로더와 클래스패스에 대한 개념이 좀 더 견고해 질 것이다. 스프링이 제공하는 다양한 애노테이션에 대해 진지하게 공부하다보면 어느새 애노테이션 프로세싱에 대해 공부하고 있을 것이며 스프링 AOP를 공부하며 다시 클래스로더, 바이트 코드조작 그리고 다이나믹 프록시 등 자바 기본 서적에는 좀처럼 등장하지 않지만 자바를 기반으로 한 여러 프레임워크 및 라이브러리에서 자주 사용하는 기술에 대해 학습하고 있는 자신을 발견했다면 야크 쉐이빙, DFS 방식의 학습에 성공했다고 볼 수 있다. 이 기술들은 스프링을 통해 사용하지 않더라도 독자적으로 활용할 수 있는 기술이다. 따라서 자바를 주력으로 삼은 개발자라면 반드시 알아야 할만큼 중요하다.

앞서 언급했던 JEE 기술인 Bean Validation, CDI가 제공하는 애노테이션과 JPA와 Servlet에 대한 공부까지 이어질 수 있다. 스프링을 공부하다보면 끊임없이 삼천포로 빠져들고 이전까지 몰랐던 자바에 대해 한층 더 폭넓고 깊이있는 지식을 습득할 수 있다. 개인적으로 모든 JEE 기술까지 일일히 깊게 파고 드는건 다소 시간 대비 효율이 떨어진다고 생각한다. JEE는 여러 스펙과 모듈의 집합체인데 각각의 모듈이 제공하는 기능에 대한 개요와 가장 중요한 기능 몇개만 파악하고 넘어가고 나중에 해당 기능을 업무에서 사용하게 됐을 때 좀 더 깊게 살펴보는 방법을 추천한다. JEE 기술은 모듈화 되어 있어 반드시 모든 JEE 기술을 써야 하는게 아니라 일부는 스프링이 제공하는 비표준 기술을 사용하고 일부는 JEE 스팩이 제공하는 기술을 선택적으로 사용할 수 있기 때문이다. 가령 예를 들어 의존성 주입 및 빈 관리 기능CDI 대신스프링이 제공하는 빈팩토리와 의존성 주입용 애노테이션으로 대체하고 JPA와 Bean Validation만 사용할 수 있다. 이런 경우에 당연히 CDI 보다는 JPA와 Bean Validation에 대해서만 조금 더 공부하는게 시간을 아낄 수 있는 방법일 것이다.


지름길은 없다

작은거 혼자 만들기.

학교에서 과제 때문에 짰던 코드 말고, 내가 스스로 생각해서 처음 만들어 본 애플리케이션은 켄트벡의 "테스트 주도 개발"을 보다가 생각난 아주 간단한 태스크 관리 툴이었다. 구현할 기능 목록을 작성할 수 있고 각 작업 마다 시작과 완료 버튼이 있어서 해당 기능마다 구현하는데 시간이 얼마나 걸렸고 작업을 완료할 수 있는 데스크탑 애플리케이션이었다. 자바 Swing API를 이용해서 대략 4~5일 정도 걸렸던거 같다. 만들면서 여러가지 고민과 생각이 오갔다. UI가 좀 생소한데 좀 더 운영체제 어울리는 UI로 만들 수는 없을까? JAR 파일 더블 클릭하는거 말고 .exe나 .bat를 쓰도록 배포할 순 없을까? 데이터는 파일로 저장할까 DB에 저장할까? 별도의 애플리케이션이 아니라 이클립스 안에서 쓸 수는 없을까? 어쩌면 고민중에 몇몇은 만들기 전에 할 수도 있었겠지만 막상 만들면서 생기는 고민이 더 많았다. 그리고 그 고민들은 정말 소중한 경험이 되고 다음에 또 무언가를 만들 때 마치 이전의 내 자신이 내게 속삭이듯 되새김질 해주었다.

2~3일 안에 만들 수 있는 걸로 해라

기본기도 중요해

원했던 기능이 동작한다고 다 된것은 아니다. 테스트는 작성했는지, 커밋은 적절한 크기로 만들었는지, IDE를 사용하며 자주 사용하는 기능에 대한 단축키는 익혔는지, 메이븐이나 그래들과 같은 빌드툴을 사용할 때 발생했던 문제와 원인 그리고 해결책은 무엇이었는지 이 모든 걸 무시하고 오로지 자신이 계획했던 일정안에 기능을 만들기만 했다면 배운게 많이 없으니 그만큼 학습의 의미가 무색하다. 쉽게 말해서, 게임은 끝냈지만 난이도를 최하 수준으로 낮추고 플레이 했거나 본인은 한 일이 없지만 다른 팀웜들이 잘해서 이겼다면 '자신의 실력 향상'이라는 목적에 의미가 있는 시간 이었을까 되돌아 볼 필요가 있다.

연습할 때 주의할 것

1. 테스트 코드 작성

2. 프로젝트 빌드 또는 패키징

3. 커밋 히스토리 관리

4. IDE 사용에 익숙해질 것

https://www.inflearn.com/course/the-java-application-test#

 

더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의

자바 프로그래밍 언어를 사용하고 있거나 공부하고 있는 학생 또는 개발자라면 반드시 알아야 하는 애플리케이션을 테스트하는 다양한 방법을 학습합니다., 그냥 개발자를 넘어 '더 나은 개발

www.inflearn.com

게시판 만들기

가장 흔히 시도하는 웹 프로젝트가 게시판 만들기인데 여러가지 이유가 있겠지만 대부분의 애플리케이션에서 사용하는 CRUD(Create, Read, Update, Delete) 즉, 만들고, 조회하고, 수정하고, 삭제하는 기능을 직관적으로 구현해 볼 수 있기 때문일 것이다.

처음 만드는 게시판이라면 아주 단순한 형태로 글을 하나 작성하고 조회하고 수정하고 삭제하고 기능을 만들어 보는게 좋겠다. 그러다 조금씩 복잡한 로직을 만들어 넣기 시작해보자. 가령, 특정 키워드를 가지고 있는 글을 검색하거나, 글 목록을 작성일자 역순으로 정렬하고 페이징, 글을 작성한 사람만 해당 글을 수정할 수 있다거나, 글을 작성 중에 임시로 저장해 놓을 수 있는 기능, 관리자 역할의 사용자는 모든 글을 수정하거나 삭제할 수 있다거나... 축하한다. 스파게티처럼 엉켜고 설켜, 여기 저기 비슷한 코드를 붙여 넣고, 어떤 코드는 한참을 봐도 내가 왜 이렇게 작성했고 무슨 뜻인지 의도를 분간하기 어렵고, 버그가 넘쳐나서 누군가에게 써보라고 하기엔 부끄러운 코드를 만들었다면 성공한 것이다. 무엇이 문제이고 무엇을 모르는지 알아냈으니 이제 한걸음씩 더 앞으로 나가면 된다.

스프링 등판

코드가 복잡하게 꼬이는 이유는 많지만 가장 대표적인 이유가 인프라 성격의 코드를 비즈니스 로직에서 분리하지 못했기 때문이다. 여기서 말하는 인프라 성격의 코드라면 객체간의 의존성 관리, 트랜잭션 처리, 인증 및 보안 등을 예로 들 수 있다. 코드를 다시 잘 살펴보기 바란다. 분명히 서로 다른 일을 하는 코드가 하나의 클래스 또는 하나의 메소드 안에 길고 복잡하게 섞여 있을 것이다. 코드를 정돈하는 방법을 익혀야 할 시간이다. 그리고 더 나아가 인프라 성격의 코드를 스프링을 사용해서 처리하고 최대한 비즈니스 로직만 코딩할 수 있게끔 만들 수 있다. 그렇게 하려면 스프링에 대한 학습이 필요하다. 그리고 여기까지 차근차근 따라 왔다면 내게 그러했듯이 결코 스프링을 학습하는게 그렇게 어렵지 않을것이다. 오히려 재미있을 것이다.

같이 만들기

드디어 목적지에 다다랐다. 각자 게시판을 만들 수 있는 개발자를 모아 공동으로 만들 프로젝트를 정하고 모여서 같이 만들어 배포해보는 연습을 하는 것이다. 이 과정을 통해 의견을 나누고 설득하고 주장에 대한 근거를 제시하고 코드로 증명해가며 협업에 필요한 다양한 활동을 직접 경험할 수 있다. 또한 Git을 좀 더 다양한 방법으로 활용할 수 있고 이슈 트래커와 CI와 CD 도구까지 설치하고 구성해 볼 수 있다. 배포 이후에 운영하는 서비스의 모니터링과 로그 메시지 분석과 장애 탐지 및 알림 설정까지 경험할 수 있다.

출처:

https://github.com/whiteship/live-study

 

whiteship/live-study

온라인 스터디. Contribute to whiteship/live-study development by creating an account on GitHub.

github.com

https://www.whiteship.me/java-playlist-ep3/

 

슬기로운 자바 학습 방법 Ep3. 지름길은 없다.

슬기로운 자바 학습 방법 마지막편으로 실제 애플리케이션을 개발하며 학습하는 방법에 대해 설명한다.

www.whiteship.me

 

공부할 것