본문 바로가기

분류 전체보기204

[알고리즘] 2차원 배열 시계 방향 회전, 180도 회전, 전치 행렬 구하기 외우면 구현 빠른 알고리즘 시계 방향 회전 (90도 회전) // origin[ROW][COL] // rotated[COL][ROW] for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { rotated[j][ROW-1-i] = origin[i][j]; } } 반시계 방향 회전 (270도 회전) // origin[ROW][COL] // rotated[COL][ROW] for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { rotated[COL-1-j][i] = origin[i][j]; } } or 시계방향 * 3회 180도 회전 // origin[ROW][COL] // rotated[COL.. 2023. 4. 10.
[서평/23-16] SQL 레벨업 : DB 성능 최적화를 위한 SQL 실전 가이드 독서기간_2023년 1월 10일 ~ 2023년 1월 20일 저자_미크 출간일_2016년 1월 30일 😦... 내가 이걸 아직도 안 썼다니... 데이터베이스, 특히 SQL은 간과하기 쉽다. 작은 예제 테이블에서 SELECT, FROM, WHERE 문을 잘 조합하면 원하는 데이터를 조회할 수 있다. 다른 테이블과 관계된 데이터의 조회도 필요한가? 그럼 JOIN을 사용하면 된다. 그런데 테이블 결합 시 발생하는 결과를 생각해본 적 있는가? 카티션 프로덕트가 초래하는 성능 이슈를 아는가? SQL 실행계획을 아는가? 조건 분기, 윈도우 함수를 아는가? 그렇지 않다면 이 책을 읽어보길 바란다. 1000개도 안 되는 데이터베이스 테이블에서 조회만 잘 한다고 SQL을 잘 쓰는 것이 아니다. 신입 개발자 준비하면서 얼마.. 2023. 4. 8.
[Spring Boot] 테스트 코드에서 프로퍼티 NullPointerException 오류 해결 @Service public class TokenService { @Value("${secret}") private String secretKey; public String generateJWT(MemberInfoDto info) { // ... Jwts.builder() .setHeader(headers) .setClaims(payloads) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() + 60 * 1000 * 60)) .signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) .compact(); } //... } 토큰 .. 2023. 4. 6.
IntelliJ 사용 시 gradle 프로젝트 out, build 폴더 차이 IntelliJ 사용 시 build 하면 out 폴더와 build 폴더가 생성 *될 수도* 있다. 두 개의 폴더는 동일한 클래스 파일을 소유하고 있다. 무슨 차이가 있을까? out - 폴더는 인텔리제이 빌드시에 컴파일한 class를 저장하는 폴더 build - 폴더는 gradle 빌드시에 컴파일한 class를 저장하는 폴더 예전에 AsciiDoc을 이용해 REST Doc을 만드는 작업을 했는데 프로젝트를 진행할 때 이상한 점이 있었다. 아스키독 테스트 코드를 구현하고 빌드를 했는데 예상대로라면 build폴더 하위에 *.ascii 파일이 생성되어야 했는데 build 폴더가 없는 것이다. 이제 그 이유를 알았다... IntelliJ에는 IDE 자체에서 빌드하는 기능을 제공한다. 평상적으로 IntelliJ 자.. 2023. 4. 5.
[Spring Boot] 개인 정보가 담긴 Jwt 토큰 발급 후 Cookie로 반환하기 oAuthService에 Jwt 토큰을 발급하는 메서드를 추가했다. public String generateJwtToken(MemberInfoDto info) { Map payloads = new HashMap(); Map headers = new HashMap(); headers.put("alg", "HS256"); headers.put("typ", "JWT"); payloads.put("name",info.getName()); payloads.put("picture", info.getPicture()); payloads.put("oauthId",info.getSub()); return Jwts.builder() .setHeader(headers) .setClaims(payloads) .setIssue.. 2023. 4. 4.
[Spring Boot] Security 없이 OAuth2 Google에서 받은 id_token 사용해 회원 정보 저장하기 2023.03.27 - [Project/모면] - [Spring Boot] Security 없이 OAuth2로 Google 로그인 구현, 유저 정보 얻기 이전 시간에 access_token을 발급받아오는 작업까지 마쳤다. 이제 id_token 안의 정보를 복호해 으로 만들어버리자. 먼저 RestTemplate을 이용해 POST 요청을 보내는 코드를 수정했다. ResponseEntity responseEntity = restTemplate .postForEntity(GOOGLE_TOKEN_URL, params, GoogleOAuthResponseDto.class); package com.momyeon.backend.dto; import lombok.AccessLevel; import lombok.Gette.. 2023. 4. 3.
[Java] String to Json 파싱하기 | Jackson ObjectMapper 온갖 JSON 파싱 방법 찾아서 적용하니까 코드가 더럽거나 실패했다. 그나마 가장 깔끔한 방법을 찾아서 공유한다!!!! 파싱 유목민 여기서 정착하다... 공식 문서 : https://www.baeldung.com/jackson-deserialize-json-unknown-properties import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; //.. 2023. 4. 2.
0. 프로젝트 승인 2023년 3월 31일 ICT 한이음(프로보노) 프로젝트 드디어 승인! 약 9개월의 긴 프로젝트가 시작됐다. 주제도 좋고 꽤 괜찮은 팀프로젝트가 될 것 같아서 기대가 된다. 열심히 해야지. 난 대상을 노린다. 2023. 4. 1.