분류 전체보기 433

[SpringBoot] @PathVariable vs @RequestParam

둘 중 뭐가 더 나은지는 사실 성능상 상관없다. 상황에 따라 더 좋은 것을 쓰면 되는데 아주 미묘한 차이가 있다. (사실 이전까지는 뭐 별반 차이없을거라 생각해서 그냥 무작정 @RequestParam 만 잔뜩 써대고 있었다. ) 1. @ParhVariable은 어떠한 Resource를 식별하고 싶다고 하면 그때 사용하면 되는 것이고 2. @RequestParam은 정렬이나 필터링을 할때 사용하면 좋다. 즉 2번의 예시를 들자면 url에 파라미터로 특정 조건에 충족하는 사람만 조회해서 가져오고 싶다면 다음과 같이 쓰면 된다. localhost:8080/test/condition=good 이런 식으로 컨디션이 좋은 사람들만 골라서 가져오겠다는 식으로 말이다. 이럴때 @RequestParam을 쓰면 좋다. 이..

[기술서적] readITzine #3 - 앞으로 계속 나아가기

오랜만에 필요한 기술서적이 있어서 두권을 구입하게 되었는데 사은품 선택 란에 리드잇 zine 3호 라는게 눈에 띄었다. 예전에도 한번 사은품 목록에 올라왔던 적이 있었는데 원래 잡다한 것을 굳이 골라서 받아놓는 것을 좋아하는 성격이 아니라서 굳이 추가하진 않았다. 그런데 이번에 다른 사은품으로 올라온 노트가 마음에 들어서 추가할까 하다가 리드잇이 눈에 걸려서 궁금해서 추가해서 읽어보게 되었다. 결론부터 말하자면 정말 재밌다. 인터넷에 서치하다보면 꼭 기술에 관련된 디테일한 내용이 아니더라도 그와 연관있는 재미난 이야기를 해주시는 분들이 많이 계시다. 그런 분들의 글을 읽으면서 좋아요와 구독을 꾹꾹 누르고 다니는데 이 매거진은 그런 분들을 모두 모아서 한번에 만날 수 있는 매거진이다. 각기 다양한 분야에서..

[SpringBoot] org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL

프로젝트를 수정하는 도중 새로운 jpa 엔티티를 추가해서 진행하고 있었는데 ddl-auto: create으로 테이블을 생성해보니 org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL 이라는 에러가 발생했다. 분명 h2 디비도 잘 돌아가고 있었는데 왜 ddl 구문에서 에러가 발생했을까? 원인은 예약어에 있었다. 밑에 사진을 보면 컬럼 중에 like 라는 컬럼이 있다. 즉 like 는 이미 mysql에 존재하는 예약어이다. 즉 이 컬럼명을 likes로 바꾸던지 prefer로 바꾸던지 해서 문제를 해결하는 것이 좋다. 즉 프로그래밍 언어에서 int를 변수명으로 선언하는 것과 비슷한 경우랄까? 혹은 assert 를 변수명으로 ..

[Dev] 프로젝트속에서 발견한 것

요즘 백엔드 프로젝트를 진행하면서 꽤나 코딩에 열중하며 지내고 있다. 정말 많은 것들을 배운 시간이라는 생각이 들었다. 거의 마무리가 되었고(?) 이제 최종적으로 어느정도 테스트를 거치고 ec2에 배포하면 끝이다. 물론 이후에도 수정해야할 사항들이 많다. 다만 최소한의 핵심기능들이 돌아가게끔이라도 만들어놓고 이후에 추가적으로 코드를 리팩토링하고 추가 요구사항들을 추가할 일이 남아있다. 사실 완성본이라기 보다는 프로토타입에 가깝다. 후순위로 미뤄둔 기능들은 아직 구현도 하지 않았기 때문이다. 애초에 팀의 목표 자체가 빠른 출시였기 때문에 사실 다른 무엇보다도 빠르게 개발해서 일단 결과물을 만들어낸다는 점에 우선순위를 두었다.  이렇게 코딩에 열중한게 정말 오랜만이라는 생각이 들었다. 그러면서 문득 내가 지..

개발 정보 2022.01.19

[Git] .gitignore 가 적용되지 않을때

왜 언제가부터인가 .gitignore가 적용되지 않는다는 사실을 발견했다. 현재 프로젝트를 진행하면서 yml 파일을 제외시키려고 사용하고 있었는데 갑자기 안된다. 브랜치들을 살펴보니 그리 오래된것 같지는 않았고 커밋 서너번 전부터 이런 현상이 나타났던 것 같다. 해결법은 간단하다. git의 캐시문제라고 한다. git bash 에서 아래와 같은 명령어를 친다. (마지막에 점 찍는거 빼먹으지 마시구) 들고있던 캐시 전부 비워주자. git rm -r --cached . 그 다음은 하던대로 똑같이 진행해주면 된다. git add -A git commit -m "removed git cach" 뭐 이런 식으로 하던대로 진행되면 된다.

인프라/Git 2022.01.18

[Rust] 러스트를 배워봅시다! - Rust language 간단 후기1 - 재밌다!

며칠전에 러스트를 배워보고 싶다는 생각에 무작정 rust doc을 찾아서 읽었다. 공식 doc이 있는데 정말 상세하게 나와있는 doc이라는 생각이 들었고 읽는데 많은 시간이 걸리지도 않았다. 현재는 IO프로젝트까지 읽고 해당 grep 프로젝트 코드를 작성한 상태이다. 역시나 모든 언어에 존재하는 변수와 데이터 타입, 함수, 제어문들에 대해 배웠는데 한가지 흥미로운 점은 다른 언어에서는 볼 수 없었던 개념이 언어 전반에 녹아있다는 생각이었다. 예전부터 러스트를 관심갖고 지켜보면서 러스트로 만든 프로젝트 사이트들을 돌아다니면서 시간날때 꼭 배워봐야겠다는 생각을 하면서 어떻게 하면 속도와 메모리 안전성을 둘다 가져갈 수 있는지에 대해 많이 궁금했었다. 그리고 그와 관련된 내용으로 소유권과 참조자, 빌림에 대해..

Rust 2022.01.15

[Dev] powershell과 cmd의 차이

환경변수 세팅을 할 일이 있어서 cmd로 설정하는데 자꾸만 $env 가 먹히질 않아서 좀더 살펴보니powershell에서 하라는 안내를 읽지 못한 탓이었다. 그런데 아무리봐도 powershell이나 cmd 나 너무 비슷하고 명령어도 똑같이 작동하는데 둘이 다른건가...? 라고 생각했는데 알고보니 다른거였다.  즉 cmd보다 powershell이 훨씬 더 많은 명령어를 동작시킨다. 왜냐면 cmd가 개발되기 전에는 powershell이 없었고 powershell은 그 이후에 만들어진 신규 프롬프트이기 때문이다.  그래서 보통 악성 프로그램의 경우에 powershell 을 노리고 접근하는 경우가 더 많다고 한다. 할 수 있는게 더 많으니까...  그러니 응용 프로그램이 powershell의 권한을 요청한다면 ..

개발 정보 2022.01.15

[Rust] 러스트를 배워봅시다.

주변에서 러스트 꼭 써보라는 말이 있어서 차근 차근 공식 문서를 읽어보기로 했다. 공식 문서가 아주 잘 정리된 케이스여서 이 문서만 따라 읽으면 얼추 개념이 잡힌다는 얘기를 들었다. 예전부터 go 와 rust 중 뭘 공부해볼까 생각하고 있었는데 이참에 rust를 한번 해보면 재밌을 것 같다. 요즘 시간도 많아서 넉넉해서 잠시나마 시간내서 문서를 읽어볼 순 있을 것 같다. 두근 두근 아래 링크가 rust 공식 document 이다. https://doc.rust-lang.org/book/ 아래는 번역본이다. 참고로 번역 퀄리티가 정말 좋다. 감사합니다. https://rinthel.github.io/rust-lang-book-ko/ 들어가기에 앞서 - The Rust Programming Language ..

Rust 2022.01.12

[Dev] 개발 과정에서 발생하는 오류의 80퍼센트는 오타가 아닐까?

오전에 잠시 프로젝트 코드를 손볼일이 있어서 리팩토링을 하는 중이었다. 하던 와중에 일부 코드에 많은 변경을 하게 되었는데 이후에 자꾸만 에러가 나서 이것저것 찾아보려고 했던 참이었다.그런데 아무리 생각해도 에러가 나는 것이 이해가 가지 않아서 다시 꼼꼼히 살펴보니 오타를 발견했다. 어째 가만보면 혼자서 묵묵히 코딩하면서 발생하는 오류의 80퍼센트는 오타이지 않을까 싶다. 물론 완성된 결과물로 내놓고 난뒤에 발생하는 오류에서는 아니겠지만 그게 아니라 혼자서 만들어가는 과정 중에 맞닥뜨리는 오류를 말할때라면 정말 맞는 말인것 같다.  예전에 이런 식으로 오타가 있을 거라는 생각을 하지 못하고 하루종일 빙빙 돌고 돌아서 말그대로 엄청난 삽질을 했던 경험도 여러번 있었다.(진짜 말그대로 지옥이었다.) 조금은 ..

개발 정보 2022.01.12

[Git] git branch & commit convention 정리

유용하게 쓸 수 있는 깃 컨벤션을 정리해놓았다. 우리 팀에서 쓰던 건데 팀원분께서 친절히 정리해서 올려주셨다. 기왕이면 지켜서 쓰자. 🧬 Git Branch Convention 형태 : 이름/기능이름_날짜 1️⃣ 각 단어 전부 소문자 - E.g. nickname/signin 2️⃣ 한 기능을 자주 수정해야 할 때 날짜 붙이기(날짜 양식 : YYMMDD) - E.g. nickname/signin_211125 📝 Git Commit Convention 형태 : 커밋타입: 커밋 메시지 - E.g. Add: 카카오 로그인 구현 커밋 타입 리스트 - Add: 기능 추가 - Fix: 코드 수정 ❗️ 잘못된 코드 수정 - Delete: 기능 삭제 - Refactor: 코드 리팩토링 ❗️ 잘 되어있는 코드 수정 - T..

인프라/Git 2022.01.12

[SpringBoot] java.nio.file.NoSuchFileException tomcat에러

흔히 발생할 수 있는 에러인데 이번엔 좀 특이한 상황에서 발생해서 기록해두게 되었다. 프로젝트를 진행하면서 게시판에 글을 작성했을때 사진도 여러장 첨부할 수 있도록 만들고 있었다. MultipartFile을 List로 묶어서 다루고 있었는데 잘 작동하는지 확인해보기 위해서 컨트롤러에 사진과 글을 전달하고 사진을 다시 프론트에서 던져주는 방식으로 작성하였다. List이 return 되는 셈이었다. 아마 사진이 찍히는게 아니라 toString() 처럼 명세라던지 아니면 path라던지 어찌되었든 뭐가됬든 뭐라도 찍히는지 확인해보고자 리턴했는데 위와 같은 java.nio.file.NoSuchFileException 에러가 발생했다. 그리고 에러 로그를 읽어보면 정말 흥미로운 내용이 있다. 에러 사유에 tomca..

[Dev] 백엔드 면접 질문 리스트

괜찮은 면접 질문 리스트가 있어서 저장해둔다! 언젠가 도움이 될 것 같다.  출처: https://oolaf.tistory.com/123 신입 면접보러 다면서 받았던 질문들입니다.컴포넌트와 모듈의 차이자바란 무엇인가자바의 구동원리 (컴파일 순서 같은 ?)JVM의 특징객체 지향과 절차지향의 차이점객체지향 언어의 특징(상속 추상 등등 …)상속과 구현의 차이점 과 특징 및 장단점오버라이딩 오버로딩의 차이점과 특징기본형 변수와 참조형 변수가 뭐가있나스택오버 플로우가 왜일어나나메모리 누수가 무엇인가메모리 누수를 막기위해 어떻게 해야하나static에 대해 설명해봐라싱글턴이 무엇인가 ? 디자인패턴을 아나 ?익명클래스와 익명객체를 아나?문자열을 끊어서 가져오거나 문자열 검색자료구조 (어레이 링크드 벡터 , 해쉬 맵 셋..

개발 정보 2022.01.09

[C++] C++ 에도 annotation이 존재할까?

요즘 springboot를 사용하면서 프로젝트를 진행중이라서 잔뜩 annotation을 사용중이었다. 그런데 문뜩 c++에도 annotation을 쓰는가? 에 대한 궁금증이 번졌다. 그래서 검색해보았는데 이렇다 할 annotation이라는건 없었고 그 대신에 generalized attributes 라는 기능을 쓴다고 한다. 아래 스택오버플로우의 답변들을 보면 뭘 말하는지 알 수 있다. https://www.codesynthesis.com/~boris/blog/2012/04/18/cxx11-generalized-attributes/ C++11 generalized attributes Generalized attributes are a new C++11 core language feature that is..

C & C++/C++ 2022.01.03

[SpringBoot] io.jsonwebtoken.security.WeakKeyException: The signing key's size is 80 bits which is not secure enough for the HS512 algorithm.

jwt 를 만들려고 하고 있는데 에러가 발생했다. 키 사이즈가 작다고 해서 단지 그저 키로 주어준 문자열이 너무 짧아서 이런 에러를 낸다고? 라고 생각했는데 정말 그게 맞다. 해쉬 알고리즘으로 바꿀때 키도 같이 주게 되는데 그냥 길이를 좀 늘려주면 해결된다. 단순한 에러였다. 아래 블로그에서 좀 더 상세한 내용을 살필 수 있다. https://lemontia.tistory.com/1021 [springboot, jwt] jwt 로 토큰 생성, 유효시간 관리 하기 이번에는 jwt를 이용한 로그인 인증을 만들려 한다. 일전에 @EnableAuthorizationserver deprecated 되면서 찾던 중 jwt가 있어 이걸 활용하기로 했다(DB로 토큰유효성 확인도 안해서 더 나은거 같기도 하고 lemon..

[SpringBoot] Error resolving template [/index]

springboot 를 통해 작업을 마치고 무사히 build까지 끝났는데 막상 구동을 하고 localhost:8080 에 들어갔더니 제목과 같은 에러가 뜨면서 갑자기 에러로그가 찍히는걸 확인할 수 있다. 정말 간단한 이유인데 만약 작성한 컨트롤러 중에서 return "/index"; 이처럼 슬래쉬 / 를 붙여서 작성해준 컨트롤러가 있다면 슬래쉬를 제거하고 return "index"; 와 같이 작성해주면 된다. (이때 index.html 이 있다고 가정하는 상황이다.) 어느 블로그를 살펴보니 슬래쉬 때문에 경로를 찾지 못해 발생하는 상황이라고 한다. 슬래쉬를 빼버리면 된다. 아래 블로그를 참조하면 여기보다 더 친절하게 설명되어있다. https://dev-jwblog.tistory.com/40 [Spring..

[SpringBoot] Springboot kakao OAuth 구현 참고 블로그

https://linkeverything.github.io/springboot/kakao-login-3/ 카카오톡 로그인 구현하기 - (3) OAuth 방식 구현하기 웹이든 앱이든 서비스를 개발하는 데 있어서 SSO(Single Sign On) 의 필요성이 계속 화두가 되는 것 같습니다. 이제 기존 시스템 이라는 것이 거의 다 있게 마련이고, 따라서 기존에 사용하던 로그인 linkeverything.github.io 위 블로그에서 많은 도움을 받았다.

[Python3] Python 에서 assert 란?

assert는 조건이 참임을 보증할때 사용한다. 어떤 함수가 반드시 정수만을 받는다고 가정한다면 assert 를 통해 정수가 아닌 값이 들어왔을때 assertionError 를 내도록 만들 수 있다. 이와 같인 방식을 방어적 프로그래밍이라고 한다. 확실하게 보장한다는거다. 물론 이 구문 뿐 아니라 실제로 타입이 되었든 value가 되었든간에 무언가를 체크하고 가드하는 동작은 반드시 작성되어있어야만한다. 아래 블로그에서 도움을 받았다. 감사합니다. https://wikidocs.net/21050 03_가정 설정문(assert) assert는 뒤의 조건이 True가 아니면 AssertError를 발생한다. ``` >>> a = 3 >>> assert a == 2 #결과 Traceback (mos ... wi..

[Functional Programming ] Functional programming 계산 모델

수업 도중 교수님께서 올려주신 링크이다. 솔직히 말해서 어려워서 안읽어봤다. 나중에 읽어보면 좋을 것 같다. https://www.dmi.unict.it/barba/PROG-LANG/PROGRAMMI-TESTI/READING-MATERIAL/ShortIntroFPprog-lang.htm Functional Programming and Lambda-calculus Contents 1. Why functional programming? 2. An imperative programming style 3. A functional programming style 4. Functions in mathematics and functions as programs 5. Functional programs 6. The e..

[Flask] ReferenceError: weakly-referenced object no longer exists 의 발생이유

며칠전 포스팅했던 글에 이어서 정확한 설명을 찾았다. https://www.py4u.net/discuss/147695 위의 링크에 달린 답변들이 많은 도움이 되었다. weakly-referenced object 는 가비지 콜렉터가 제거할 대상들을 살피는 와중에서 그것이 제거되지 않을 것이라고 보장해주지 못할 경우에 놓인 객체를 말한다고 한다. 그러니 내가 쓰려고 하는 대상이 가비지 콜렉터에게 제거당할 가능성이 존재한다는 거다. 그렇기 때문에 에러가 발생한다. 나의 경우도 함수가 종료하면 당연히 local variable 들은 사라질텐데 그 점을 염두에 두지 못하고 코드를 작성한 탓에 이런 에러가 발생했던 거다. (나는 함수의 local variable에 mysql dbconnect 관련 객체를 받아서 그..

Python3/Flask 2021.11.25

[Flask] mysql.connector.errors.DatabaseError: 2014 (HY000): Commands out of sync; you can't run this command now

Flask 를 통해 개발하면서 sql을 직접 작성해줄 일이 있을텐데 이때 특정 sql문이 두개 이상 존재할때 연달아 실행되어야할 sql문들의 중간에서 commit을 치게 되면 이후의 sql문이 실행되지 않는 경우가 발생했다. 내 경우에는 아래와 같은 경우였다. sql = """update user set user_address=%s, user_job=%s where user_SSN=%s; commit;""" mysql_cursor.execute(sql, (data)) data2 = (outer_user_SSN) sql = """select * from user where user_SSN = %s;""" 위의 코드에서 첫번째 sql문에서 commit을 미리 치게 되니 아래의 sql구문을 실행할적에 mysq..

Python3/Flask 2021.11.23
반응형