전체 글

싸피 비전공9기 비전공자바 서식하는 초보개발자 백준 - https://www.acmicpc.net/user/esu08259 깃허브 - https://github.com/qkrrlgus114
프로젝트하다가 매일 api 경로를 고민한 지 벌써 10만 번째....그냥 프롬프트 하나 만들어서 추천서비스 간단하게 만들면 좋지 않을까?라는 생각이 들었다. 제작 이유1. chat gpt한테 직접 물어보자니 다 설명하기 귀찮기도 하고 얘가 또 말이 얼마나 많던지2. 간단한 토이 프로젝트로 사용하기 위해3. 동료들이 불편했던 모습을 자주 목격, 해결해주고 싶었다. 그래서 만들어보았습니다. 기능1. 회원가입2. 소셜로그인3. chat gpt에게 추천받기  프로젝트는 Vue3와 SpringBoot 3.2.4를 이용했습니다.주 기능은 3번입니다. 프롬프트사용자에게 model, method, resource, content를 받아서 추천 3개의 restful api를 뽑아내는 것이 목표. 사실 따지고 들어가면 관..
· CS지식
HTTP : 하이퍼 텍스트 전송 프로토콜 (여기서는 HTTPS를 위해 간단하게 넘어가겠습니다.) HTTP -> 데이터가 평문으로 전송된다. 즉 패킷 도청으로 데이터 유출 가능성이 생김(보안상으로 매우 위험) 그래서 우리는 Security가 추가된 HTTPS를 사용하게 됩니다. HTTPS 데이터 전송의 보안을 강화하기 위해 사용 SSL/TSL 프로토콜을 통해 데이터 암호화 간단 정리 HTTP의 보안 문제를 해결하기 위해 SSL/TLS를 추가한 HTTPS를 사용한다. 그러면 HTTPS를 설정하는 과정, 데이터를 암호화해서 주고받는 과정에 대해 정리를 해보려고 합니다. SSL의 개념 Secure sockets layer의 약어(보안 소켓 계층) 전송되는 데이터를 암호화하는 표준 기술 TLS의 개념 Transp..
여태 프로젝트 진행하면서 동시성 문제에 대해 생각하지 않았다. 사실 그럴 힘이 없었다. 근데 자바에서는 멀티 스레드를 지원하는데 문제는 여기서 발생한다. 멀티 스레드 -> 즉 하나의 프로세스에서 여러 개의 스레드가 동시에 작업을 진행한다. 씈크럼 프로젝트에서 스크럼의 참여 인원을 +1 시키는 메서드가 존재한다. public void plusCurrentMember(){ if(this.maxMember 최대 멤버 : 20명, 현재 멤버 : 19명 만약에 두 유저가 해당 스크럼 정보를 통해 참여를 진행한다면? 둘 다 현재 참여가 가능하다고 판단해서 Update Query를 날리게 되고, 결국 데이터 정합성에 문제가 발생한다. 나는 여태 이런 경우를 생각하지 않고 진행했었는데 이제는 멀티 스레드에 대해 생각할..
· 오류해결
새 프로젝트를 생성해서 MySQL을 연결했는데 해당 에러가 발생했습니다. Access denied for user 'root'@'localhost' (using password: YES) spring: jpa: hibernate: ddl-auto: create show-sql: true datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/stock_example username: root password: 0000 yml 설정은 위와 같았고 cmd로 mysql 실행했을 때 비밀번호 0000으로 정상적으로 접속 성공했습니다. 많은 블로그 내용을 찾아봤지만 결국 password를 읽지 못하는 문제였고 ..
· JAVA
우선 내가 여태 알고있던 Java의 실행 과정이다. 1. 개발자가 작성한 .java 파일을 컴파일러가 .class(바이트코드 파일)로 변경한다. 2. JVM의 클래스 로더가 .class를 메모리에 적재시킨다.(런타임 시점) 3. JVM의 실행 엔진이 메모리에 적재된 바이트코드를 실행 시킨다. 간단하게 위 단계의 개념으로 알고있었는데, 조금더 세세하게 내부 개념을 정리해보려고 한다. 컴파일 과정 Java를 설치하면 javac.exe의 형태로 컴파일러가 먼저 설치된다. 자바 컴파일러가 개발자가 작성해놓은 .java 파일을 .class(바이트 코드)로 변경시켜주는 역할을 한다. 자바 코드 public class Human{ private final String name; private final int age..
· JAVA
많은 사람들도 그렇고 나도 아래의 기본 개념으로 이해하고 있었다. equals() : 두 객체의 "내용"이 같은지 비교한다. hashcode() : 객체의 고유한 해시코드를 반환한다. 그러면 2개의 값이 동일한 객체를 만들어서 equals()를 사용하면 true가 나와야겠네? Human h1 = new Human("박기현", 23); Human h2 = new Human("박기현", 23); System.out.println(h1.equals(h2)); // -> 결과 : false 그러나 실제 결과는 false가 나온다. 그 이유는 Object 타입의 equals()메서드 내부를 보면 이해할 수 있다. 내부에서 ==을 이용해서 값을 리턴한다. ==을 사용하게 되면 두 객체의 주소값이 같은지 확인한다. ..
프로젝트를 진행하면서 람다는 시큐리티에서 사용해봤지만 Stream은 전혀 사용하지 않고 있었다.(잘 모르기도 했고 for문이 더 편했어서) 이번에 stream을 사용해보고자 코드를 리팩토링하고 시간을 측정했는데 생각 외의 결과가 나왔다. 아래는 스크럼을 조회하는 서비스이고 데이터는 2000개, 스레드 20개, 루프카운트 10으로 조회를 시작했다. // 스크럼 팀 조회 @Override public ScrumRoomListResponseDTO findScrums(Long teamId) { User user = securityContext.getUser(); Team team = teamRepository.findById(teamId) .orElseThrow(() -> new TeamNotFoundExcep..
유저 닉네임 변경 API를 예시로 들어보자. PatchMapping을 사용해서 특정 컬럼만 업데이트하는 RESTAPI라고 선언을 하고 nickname을 받아서 JPA의 더티체킹으로 업데이트를 진행한다. 우리가 원하는 건 닉네임만 업데이트가 진행되길 원한다. 그러나 결과는 그게 아니던데??? 분명 업데이트 쿼리는 나가는데 왜 모든 컬럼에 대해서 set이 들어가는 거지? 결국 이는 리소스 낭비로 이어지지 않나? 라는 생각이 들어 그 이유와 해결 방법을 찾아보았다. 이유 JPA의 구현체인 하이버네이트는 결국 JDBC API를 내부적으로 사용하는데, 웹 개발을 공부하셨던 분들이라면 Statement와 PreparedStatement를 들어보셨을 것이다. Statement를 사용하면 쿼리를 사용할 때마다 아래의 ..
indeep
indeep한 개발자