{"id":34661865,"url":"https://github.com/devktak/jwt","last_synced_at":"2026-05-27T10:32:50.568Z","repository":{"id":220789747,"uuid":"744407938","full_name":"DevKTak/jwt","owner":"DevKTak","description":"jwt 공부","archived":false,"fork":false,"pushed_at":"2024-03-06T03:38:51.000Z","size":84,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-03-06T04:37:11.605Z","etag":null,"topics":["springsecurity-jwt"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DevKTak.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-01-17T08:36:53.000Z","updated_at":"2024-02-12T15:27:41.000Z","dependencies_parsed_at":"2024-02-04T11:30:30.913Z","dependency_job_id":"7f842ed6-92c3-4be6-a798-d9c107c300a4","html_url":"https://github.com/DevKTak/jwt","commit_stats":null,"previous_names":["devktak/jwt"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/DevKTak/jwt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevKTak%2Fjwt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevKTak%2Fjwt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevKTak%2Fjwt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevKTak%2Fjwt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DevKTak","download_url":"https://codeload.github.com/DevKTak/jwt/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevKTak%2Fjwt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33562772,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-27T02:00:06.184Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["springsecurity-jwt"],"created_at":"2025-12-24T18:53:57.619Z","updated_at":"2026-05-27T10:32:50.564Z","avatar_url":"https://github.com/DevKTak.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003e jwt 공부하기전에 간단하게 정규화, JPA, 클린코드 리마인드~\n\n# 정규화\n\n\u003e 이상현상(대부분 중복)을 없애는 과정, 프로세스\n\n- 무결성, 단일성...\n- 이로인해 정규화가 거듭될수록 DB에 중복된 데이터를 안넣기때문에 `원자성`, `용량`이 줄어듬\n\n**단점**\n\n- 귀찮다. 쿼리 많아진다. 복잡한 연산이 많아진다.\n- =\u003e 속도가 느려진다. (항상은 아님)\n\n\\* **반정규화:** 너무 느려질경우 반대로 정규화\n\n### 제 1 정규화\n\n- 하나의 셀에는 하나의 데이터만\n\n### 제 2 정규화\n\n- 부분 종속을 없애자\n\n### 제 3 정규화\n\n- 종속을 없애자\n\n**`결국엔 1, 2, 3을 나눠서 외우려 하지말고 종속을 없애면 된다.`, `실무에서는 3 정규화면 충분하다.` + BCNF 정도!**\n\n**참고**\n\n1. 테이블명은 단수, API 복수형\n2. 후보키 고려 X\n3. PK(2개 이상 컬럼 조합) X\n\n# JPA\n\n### ddl-auto\n\n- 개발: create, create-drop, update\n- 테스트: update, validate\n- 운영: validate, none\n\n### log level\n\n- trace\n- debug: 개발\n- info: 운영\n- error\n\n# 클린코드\n\n## 의도가 분명하게 이름을 지을 것\n\n// 만료여부   \nboolean **`isEnd`**  \nboolean **`isExpired`** = false;\n\ncf. 자바 빈 표준: get / set / is / has\n\n// 가장 최근 비밀번호 변경 날짜로부터 로그인한 현재까지의 날짜 차이 수 int **`daysSinceLastChangePassword`**;\n\n## 모호한 단어는 포함하지 말 것\n\nList\\\u003cAuthority\\\u003e authorityList; // 자료형과 중복 List\\\u003cAuthority\\\u003e **`authorities`**;\n\ncf. cmd, biz, ctl, msg, pw, impl, config ... 너무 명확한 변수기에 써도는 되지만 명확하다는 기준이 애매모호하기에 난 안쓰도록 하겠다.\n\n## 보편적인 이름은 지양할 것\n\npublic int getRectangleSum() { ❌ int result, sum;   \n⭕️ int **`rectangleSum`**;\n\n    return rectangleSum;\n\n}\n\n// 보편적으로 tmp를 사용한것이 아니라 진짜로 임시로 쓰는 변수라 가능 if (right \u003c left) {\n**`tmp`** = right; right = left; left = **`tmp`**; }\n\n## 불필요한 단어는 지양할 것\n\nCustomer **`customerInfo`**; Account **`accountData`**;\n\n불필요한 `Info, Data` 제거\n\n## 발음하기 쉬운 이름 사용할 것\n\n// generate year, month, day, hour, minute, secound public void genymdhms() {}\n\n// 리턴 타입이 void 라는 것은 멤버변수에 값을 넣어준다는 함축적인 의미를 내포한다.\n\n// YYYYMMDD // 패턴 같은 경우는 메서드 이름에 나타낼 수 없기 때문에 주석 사용 가능!\npublic void\n**`generateDate`**() { datetime = ... }\n\n## 중첩 반복문 인덱스 이름은 구체적으로\n\nfor (int i = 0; i \u003c ...) { for (int j = 0; ...)\n}\n\nfor (int **`userIdx`**) { for (int **`memberIdx`**)\n}\n\n## 굳이 안 적어도 아는 말은 적지 않기\n\nString m_strTitle = \"Sheet\";\n\nString **`title`** = \"Sheet\";\n\n## 부정보다는 긍정\n\n❌ boolean unsableSSL = true;   \n✅ boolean canAbleSSL = true;   \n✅ boolean isAbleSSL = true;\n\nex. ✅ boolean isExpired = true;   \n❌ boolean isNotExpired = false;\n\n❌ if (!debug)\n✅ if (debug)\n\n✅ if (pets.hasAnimal(\"pinkElphant\"))\n\n## 이름 지어보기\n\n클래스명: 치킨 집 =\u003e ChickenStore, ChickenRestaurant\n\n필드\n\n- 매장 이름: String =\u003e storeName / restaurantName -\u003e **`name 클래스가 이미 이름을 가지고 있기 때문에 name으로도 가능`**\n- 매장 오픈일: Date =\u003e openDate\n- 사장님 이름: String =\u003e ownerName / ceoName / bossName /\n  masterName **`예를들어 사장님에 대한 개인정보 등 넣을 정보가 많을 경우, 사장님을 객체로 바꿀 수 있다. Owner 등으로 사용 가능`**\n\n메소드\n\n- 매장 정보 출력: void =\u003e printInfo(Data) / showInfo =\u003e **(Override) toString()**\n- 주문 접수: void =\u003e acceptOrder()\n- 주문 거절: void =\u003e rejectOrder()\n\n**`접수에 take, get, receive, accept 등이 있지만 애매할땐 반대되는 개념을 생각해서 짝을 맞춰주자`**\n\n## 어떻게 바꿀 수 있는지 생각해보기 (메소드 추출 + 호출 순서)\n\n**변경 전**\n\n```java\nvoid func() {\n    ...\n    // compute score\n    score = a * b + c;\n    score -= discount;\n}\n```\n\n**변경 후**\n\n```java\nvoid func() {\n    ...\n    computeScore();\n}\n\nvoid computeScore() {\n    score = a * b + c;\n    score -= discount;\n}\n```\n\n1. **`메소드를 추출`** 한다.\n2. func()에서 computeScore();가 나오고 구현부를 보는 **`순서`** 가 읽기 편하다.\n\n## 반환은 언제 하는게 좋을까\n\n✅ 가능한 빨리, 참조 변수면 무조건 null 체크해서 바로 리턴 ❌ 제일 끝에서 한번에\n\n## 코드 포맷 맞추기\n\n1. **K \u0026 R (국내 자바에서 많이 사용하는 스타일)**\n\n```java\npublic class Person {\n    public void getNmae() {\n        if (...) {\n\n        }\n    }\n}\n```\n\n2. **BSD (JS에서 많이 사용하는 스타일)**\n\n```javascript\npublic class Person \n{\n    public void getName()\n    {\n        if (...)\n        {\n            \n        }\n    }\n}\n```\n\n✔︎ 한 클래스당 200자 내외로 하자.\n\n## null\n\n🧐 null 체크의 주체는 누구여야 할까?\n\n❌ 널을 확인해놓고 service로 넘겨서 널 체크의 주체를 전가 하는 방법(책임을 안지고 null을 던짐, 프로그램 통틀어서 null을 던지는 것은 있을 수 없는 일!)\n\n```java\npublic class UserRepository {\n    \n    EntityManager em;\n\n    public List\u003cUser\u003e getUsers() {\n        List\u003cUser\u003e users = em.findAll();\n\n        if (users.size() == 0) {\n            // return null;\n        }\n    }\n}\n```\n\n✅ null을 생성하거나 처음만난 주체는 책임을 져야 합니다.\n\n```java\npublic class UserRepository {\n    \n    EntityManager em;\n\n    public List\u003cUser\u003e getUsers() {\n        List\u003cUser\u003e users = em.findAll();\n\n        if (users.size() == 0) {\n            1) throw new DataNotFoundException();\n            2) return new List\u003c\u003e\n        }\n    }\n}\n```\n\n\u003cimg width=\"605\" alt=\"image\" src=\"https://github.com/DevKTak/jwt/assets/68748397/d5a696d4-d0fd-4905-8322-fde6bea0d385\"\u003e\n\n \u003cbr\u003e\n\n# Spring Security\n## [SpringBoot 2에서 3으로 올릴 때, 주의 사항]\n\n1. 프로젝트 JDK 버전을 17 이상으로 올립니다.\n2. SpringBoot 버전을 순차적으로 (2.5 \u003e 2.6 \u003e 2.7) 업그레이드 합니다.\n3. javaEE -\u003e Jakarta EE로 변경하기 위해, import javax. 패키지를 import javkarta.로 변경합니다. (한땀한땀 변경해야함..ㅎ…)\n4. Deprecated된 코드와 설정을 확인하세요.\n5. (옵션) AntPathMatcher를 사용중이라면, PathPatternParser로 변경하세요.\n6. build.gradle을 열어서 SpringBoot 버전을 3으로 마이그레이션 하세요.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevktak%2Fjwt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevktak%2Fjwt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevktak%2Fjwt/lists"}