썸네일 삽질기록 #8 Optional, 스프링 예외처리 (2022.03.15) 스프링 == 김영한님 강의인 것처럼 많은 사람들이 영한님 강의를 보고 스프링 프로젝트를 만든다. 물론 나도 그렇다. 스프링 입문 강의를 열심히 따라가면서 이렇게 하는 거구나 하고 슥슥 만들다 보면, "이거 왜 이렇게 짰어요?" 하는 리뷰어들의 질문이 들어온다. 짧게 심호흡 한 번 하고 진짜 공부는 이 때부터 시작. 그니까 Optional 왜 쓰는 거예요 특정 ID 값에 해당하는 유저를 찾는다고 해 보자. 사실 지금 내가 만들고 있는 건 아주 기본적인 어플리케이션이라서 Repository에 findById()가 있고 Service에도 아이디로 유저를 찾는 메서드가 있다. 기본적으로 Controller에서 Service의 findById()를 호출하면 내부적으로는 Repository의..
썸네일 삽질기록 #7 html form의 속성들(method, action) (2022.03.03) 스프링 공부를 시작한 뒤로 반쯤은 신기하고 반쯤은 잘 이해가 안 되는 채로 우선은 큰 흐름들을 잡아가고 있다. 우선 아무리 기초적인 것이라도 내가 궁금한 것들, 내가 고민했던 것들을 정리해 본다. POST가 안 돼 회원가입 기능을 간단하게 구현하다가 삽질을 좀 했다. 미리 주어진 회원가입 폼 페이지 파일인 form.html을 컨트롤러와 연결해서 폼에서 id, 이름 등의 정보를 받아서 POST해서 넘겨주는 작업이었는데, 그냥 간단하게 될 줄 알았는데 잘 안 됐다! 가장 먼저 갸우뚱했던 문제는, 분명히 id, 이메일, 비밀번호 같은 개인정보를 입력해서 가입하는 과정인데 주소창에 해당 정보들이 param이 되어서 뜬다는 점이었다. 이렇게 입력하면 주소창에 내가 입력한 정보들이 다 떠버린..
삽질기록 #6 Spring Boot Devtools 설정 (2022.03.01) 스프링도 처음 다루고 이것저것 새로워서 환경들을 새롭게 세팅해야 할 것들이 많은데, 가끔 신기할 정도로 내 환경에서는 잘 안 돌아가는 것들이 있게 마련이다. 우선 며칠 간 새롭게 건드렸던 부분들을 정리해 본다. Spring Devtools를 사용해 자동 재시작 설정하기 의외로 복병이었다. 뭔가 뷰 쪽에 넘어가는 게 수정될 때마다 스프링 어플리케이션을 재시작해 줘야 한다니! M1 max 맥북 프로였으면 사실 그냥 쓰지 않았을까? 하지만 나는 내년까지 버텨줄지 알 수 없는 2015 맥북프로를 쓰고 있다. 중지하는 것도 한세월, 재시작하는 것도 한세월이기 때문에 여기저기 많이 찾아보았는데, 대부분 1) Spring devtools 의존성 추가 2) 인텔리제이 설정 -> Build, Ex..
썸네일 삽질기록 #5 git detached HEAD (2022.02.25) 오늘도 또 깃! 이렇게 애매하게 알고 있다 보면 분명히 언젠가 큰 사고를 칠지도 모른다는 생각을 하면서... Pro Git을 조금씩 읽어 봐야겠다고 생각했다. 나는 마지막 커밋으로 돌아가고 싶었을 뿐인데 오늘의 삽질은 rebase 같은 아이가 아니었다. 생각해 보면 아주 단순하고 당연한 부분에서 삽질을 했다. 페어 프로그래밍을 하다가 뭔가 꼬여서 지금까지 쓴 내용을 날리고 최종 커밋한 부분으로 돌아가고 싶었다. git checkout 마지막_커밋_해시값 명령어를 입력했는데, 뭐라고 한참 뜨더니 오류인가 싶었지만 파일 내용에 변화가 없었다. 커밋 이후에 작성한 내용도 그대로 남아 있었다. git에서 무의미한 명령어 치면서 헛발질 한 게 하루이틀이 아니었기 때문에, 그냥 이게 아닌가보..
썸네일 삽질기록 #4 자바 Scanner next()와 nextLine()의 차이 (2022.02.23) 가끔 명확한 개념을 모른 채로 이건가? 저건가? 이거 안 되면 저거 써보지 뭐 하면서 바꿔가면서 쓰는 개념들이나 메서드들이 있다. 그 중 하나가 Scanner인 것 같은데, 오늘 특히 next()와 nextLine()의 차이가 헷갈려서 잠깐 삽질을 좀 했다. next()와 nextLine()의 차이 next() 먼저 next()는 간단히 말해서 공백(스페이스)를 구분자로 해서 문자열을 토큰화한다고 보면 된다. Scanner sc = new Scanner(System.in); int i = 1; while (sc.hasNext()) { System.out.println(i); System.out.println(sc.next()); i++; } 여기서 hello there hello ..
썸네일 삽질기록 #3 일급 컬렉션, 자바 Enum (2022.02.22) 오늘 썼던 코드들 중 제대로 모르고 썼던 개념들을 위주로 정리해 본다. 일급 컬렉션(First Class Collection) 향로님의 블로그에 잘 정리가 되어 있는데, 기본적으로 Map이나 List같은 Collection을 클래스로 Wrapping하고, 해당 클래스 외에는 다른 멤버변수를 두지 않는 것을 의미한다. 그냥 List를 쓰면 계속해서 List에 값이 추가될 수 있다는 단점이 있다. 이는 저번 삽질기록 #1에서 보았던 List 멤버 변수의 값 변경 문제와도 맞닿아 있다. 그럴 때 해당 collection 외의 다른 멤버 변수는 갖지 않는 클래스로 collection을 wrapping하면, 클래스 자체를 일종의 자료구조처럼 쓰면서 값의 불변성을 보장받을 수 있다. publ..