qjawnswkd의 등록된 링크

 qjawnswkd로 등록된 네이버 블로그 포스트 수는 398건입니다.

Spring Batch 메타데이터 테이블 [내부링크]

메타데이터 테이블 Spring Batch 작업에는 이러한 테이블들이 필요하다. BATCH_JOB_INSTANCE BATCH_JOB_INSTANCE 테이블은 Job Parameter 에 따라 생성되는 테이블이다. 같은 Job 의 Job Parameter 가 다르다면? 같은 Job 이여도 Parameter 가 다르면 BATCH_JOB_INSTANCE 에는 기록되며, 같다면 기록되지 않는다 BATCH_JOB_EXECUTION JOB_EXECUTITON 과 JOB_INSTANCE 는 부모-자식 관계이며 JOB_EXECUTION 은 JOB_INSTANCE 가 성공/실패 했던 모든 내역을 갖고 있다. 고의적으로 step1 에서 Exception 을 발생시키면 이렇게 실패 내역도 나온다 그리고 다시 코드를 수정해 Job 을 성공시키면 JOB_INSTANCE_ID 가 3인 Job 내역이 COMPLETED 로 하.......

InetAddress.getLocalHost().getHostName() took 5000 milliseconds to respond. Please verify your netwo [내부링크]

회사에 받은 맥북을 사용하는데 스프링 서버를 실행할 때마다 이러한 문구가 뜨면서 엄청 오래걸렸다. (아마도 hostname 을 찾는데 시간이 소요되는것 같다) 업데이트도 해봤지만 해결되지 않았다.. 결국 해결방법을 찾았는데 이렇게 터미널에 hostname 을 입력하면 hostname 이 나온다. 터미널에 이렇게 입력해 etc/hosts 편집창을 열면 이렇게 적혀있는 곳이 있을텐데 여기에 127.0.0.1 이랑 ::1 뒤에 아까 찾았던 hostname 을 입력해주면 그 다음부터는 스프링 서버가 빠르게 시작된다.

@JsonFormat 사용시 주의사항 (날짜가 하루 앞당겨져서 나오는 이슈) [내부링크]

기존에 Date 날짜를 json 으로 표시해줄 때 이렇게 사용했는데 날짜가 자꾸 하루가 앞당겨져서 표시가 되었다. 디버깅을 해본 결과 데이터는 정상적으로 Response 객체에 전달되었다. 살펴본 결과 @JsonFormat 의 default timezone 값은 UTC 이다. 따라서 이렇게 Asia/Seoul 을 명시해줘야 한다.

Cors 오류 web, security 설정 [내부링크]

학교 캡스톤 프로젝트를 진행하다가 클라이언트와 rest api 통신하는데 CORS 오류가 발생했는데 CORS 오류는 서버와 클라이언트 통신에서 클라이언트가 서버에 요청을 할 때 request 헤더에 orgin 라는 곳에 클라이언트의 주소를 담아서 보내게 되는데 서버가 응답을 해줄 때 response 헤더에 acess-control-allow-origin 이라는 곳에 클라이언트의 주소를 명시해줘야지 cors 오류가 발생하지 않는다. 따라서 이렇게 설정해주고 진행하였는데 인증이 필요한 곳에서는 CORS 오류가 발생했다 그렇다면 spring security 에서도 똑같이 CORS 설정을 해줘야한다 그리고 필요한 경우 cors 의 다른 설정도 추가해서 진행하면 된다. (credentials 를 true.......

oh my zsh 플러그인 (하이라이트, 자동완성, 이름가리기) [내부링크]

명령어 색깔 플러그인 자동완성 플러그인 터미널 이름 가리기 컴퓨터 이름으로 표시 아애 가리기

2021 네이버 웹툰 하계인턴쉽 후기 [내부링크]

이전 이야기 요기에 하계인턴쉽 지원했던 후기를 적었던적이 있다! 인턴 이후에 참 오랜만에 글을 써본다~~ 그동안 바빴던 것도 있고 인턴 이후에 쉬느랴 못적은 것도 있다. 입사 후 생활 내 기억을 되짚어 본다면.. 인턴 입사 전에 미리 회사에 가서 맥북도 받고 월컴 키트도 받았었다. 그리고 코로나 때문에 인턴 두달동안 계속 재택근무로 인턴 근무를 하게 되었다. (결론부터 말하자면 아쉽게도 회사에 간 기억은 입사 전에 한번, 최종 발표날 한번 이렇게 총 두번이였다) 이번에 인턴에서 디자인, 기획, 개발, HR 등등 여러 직군들이 모두 인턴에 뽑혔었다. (내가 속한 부서에 서버 개발자는 나혼자였다!) 그리고 인턴 근무 중간에 모든 인.......

SpringBoot 와 Nginx 연동해보기 [내부링크]

이렇게 클라이언트가 요청시 Nginx 를 통해 SpringBoot 에 접근하도록 해주려고 한다. 전에 Nginx 의 포트를 80으로 바꿔주었고 이 경로로 접근 했을 때 SpringBoot 서버로 요청이 가게 설정해줘야 한다. 편집을 위해 nginx 설정파일로 들어가면 여러가지 설정들이 있는데 http 부분의 server location 에 proxy 설정을 추가해야한다. 이렇게 서버 주소를 추가해주면 / 로 요청이 오면 8080 포트로 요청을 넘겨주게 된다. ( / 이후의 요청들은 다 넘겨지게 된다 ex /users, /users/2 ...) Nginx 서버가 Reverse Proxy 역할을 하게되는데 SpringBoot 서버에선 요청한 클라이언트의 IP 주소를 Nginx 서버의 IP 로 인식하게 된다. 그래서 이러한 설.......

네이버 웹툰 하계인턴쉽 지원 후기 [내부링크]

지원동기 새로운 성장에 목말라 있었는데 공고를 보다가 네이버 웹툰의 채용 동영상을 봤는데 스스로 성장하는 분위기를 강조했었다. 그 점이 되게 좋게 다가오고 네이버 웹툰이라는 서비스는 내가 이용하는 서비스이기도 하고 정말 많이 성장하고 있는 회사이기도하고 현직자 분들께 코드 리뷰를 받으며 한번도 경험해보지 못한 실무를 경험해보면서 성장이 하고싶어 부랴부랴 마감 당일날 서류를 써서 접수를 했었다! (네이버 웹툰은 내가 가고싶고 동경하는 회사들중 하나다..!!) 서류합격 감격스럽게도 서류합격이 되었다!! 생에 첫 지원에 서류합격이 되니까 기분이 좋았다! 면접 합격 후 2주동안 기술지식들 위주로 열심히 면접준비를 하고.......

RedisTemplate 를 이용해 Redis (String, List, Set, Sorted Set, Hash) 테스트 해보기 (Lettuce) [내부링크]

Redis 를 사용할 때 보통 Jedis 와 Lettuce 를 이용하는데 Lettuce 는 비동기로 요청을 처리하기 때문에 고성능을 자랑하기 때문에 Lettuce 가 좋다. 향로님께서 정리하신 Jedis vs Lettuce 를 보면 Lettuce는 TPS/CPU/Connection 개수/응답속도 등 전 분야에서 Jedis 보다 우위에 있다! (직접 테스트를 하셨다) Gradle & application.yml Redis 설정 (Lettuce) Serializer 를 세팅 안해주면 스프링에서 조회할 땐 정상 작동하지만 redis-cli 에는 이렇게 직렬화가 안돼서 저장이 되어버린다. key, value Serializer 를 세팅해줘야지 redis-cli 에도 이렇게 정상적으로 저장된다. (setKey(Value)Serializer 로 String, list, set, sorted set.......

Redis 에 @Cacheable, @CachePut, @CacheEvict 적용해보기 [내부링크]

Redis 에는 여러가지 캐싱 방법들이 있지만 위 방식으로 적용해볼 것이다 어노테이션 (이 어노테이션들은 스프링 AOP 방식으로 동작한다) Gradle, Application.yml, RedisConfig 세팅 전에 썼던 포스팅에서 한 세팅이랑 같다. 다만 @Cacheable, @CachePut, @CacheEvict 를 사용해주기 위해 @EnableCaching 을 설정해주었다 Controller 테스트해보기 위해서 간단한 게시글 작성, 수정, 읽기, 삭제 로직을 만들고 key 에는 캐시할 키를 지정해야하고 value 는 캐시 이름을 적어주면 된다. (post 는 id 를 pk로 잡고 있으므로 id 를 key 에 넣으면 된다) 조회 테스트 @Cacheable 테스트를 위해 먼저 게시글들을 작성한 후 게시글 1을 조회해보면 Red.......

Text '~~' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor [내부링크]

클라이언트에서 날짜 입력 값을 받아서 LocalDateTime 으로 변환하는 도중 오류가 생겼다. Text '~~' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor LocalDateTime 으로 변환 도중 생긴 오류라고 적혀있다. 보니까 LocalDateTime 으로 변환하려면 시간이 꼭 들어가줘야 했다. 따라서 따로 시간을 명시해주지 않을 경우 00시00분00초로 설정해주면서 변환해주는 방법이 있고 아니면 시간을 명시해주는 방법이 있다.

@WebMvcTest 에서 OAuth2 @AuthenticationPrincipal 적용 [내부링크]

Spring Security 의 jwt 나 폼로그인을 적용 했을 때 Principal 이나 @Authentication 를 사용하게 되는데 이는 @WithMockUser 로 테스트하면 된다. 하지만 OAuth2 를 적용시켰을 때는 @AuthenticationPricipal 을 사용하게 되는데 이때 여기가 null 값이 들어오게 돼서 NPE 오류가 발생했다. 그래서 WebMvcTest 의 이부분에 OAuth2 를 추가해줘야되는데 SecurityMockMvcRequestPostProcessors 클래스에서 제공해준다. (Spring Security 가 제공해준다) 이렇게 oidcLogin() 에 SecurityMockMvcRequestPostProcessors 클래스를 스태틱 임포트 해주면 해결된다. (추가적으로 access-token 값의 내용들도 추가해줄 수 있다)

Intellij Spring Boot 빌드시 build 폴더가 안보일 때 [내부링크]

Project 폴더 보기 설정에서 Show Excluded Files 를 체크해주면 된다

Gradle 7 에서 asciidoctor 빌드시 asciidoc 폴더가 생기지 않는 이슈 [내부링크]

Spring Boot 는 2.5.1 Gradle 은 7.0.3 버전 asciidoctor 플러그인은 1.5.8 버전을 사용중이다 RestDocs 를 작성하고 빌드를 했지만 문서 html 파일이 생성되는 asciidoc 이라는 폴더가 생기지 않았다. 또한 gradle 설정에서 build/asciidoc/html5 안에 있는 html 파일들을 정적 리소스 폴더에 copy 해주는 작업을 명시했었는데 org.asciidoctor.gradle.AsciidoctorTask method, property ~~ should not be annotated with @Optional, @InputDirectory 이러한 오류가 뜨면서 build 가 실패했다. 보니까 메서드 asGemPath(), 프로퍼티 asciidoctor, asciidoctorExtensions 가 사라졌다고 오류가 떴다. 보니까 전에는 안그랬는데 Gradle 7 을 사용.......

Spring 에서 mybatis 간단히 써보기 @Insert, @Results, @ResultMap, @Select, @Many [내부링크]

맨날 JPA 만 사용하다가 mybatis 을 사용할 일이 생겨서 깊이 학습하기 전에 간단하게 사용해보는 연습을 해보았다. (간단한 회원, 포스팅 테스트) Dependency UserMapper 생성 인터페이스를 생성하고 @Mapper 어노테이션을 붙여준다. UserMapper 를 주입받아서 사용한다. (간단히 사용법을 익히기 위해 Service 단이 아닌 Controller 에서 사용) 회원 INSERT @Options 은 auto_increment 로 생성된 키를 가지고 User 객체의 id 필드에 값을 설정해달라는 의미이며 (이 작업을 통해 insert 된 id 값이 User 객체의 id 필드에 넣어진다) 회원 SELECT ALL @Result 를 통해 User 객체의 필드와 DB 테이블 컬럼을 매핑할 수 있다. @Results 를 통해 묶.......

Spring Batch 란? [내부링크]

Spring Batch 로 일괄 처리해야하는 부분이 생겨서 공부를 시작했다. 먼저 주요 개념을 살펴보고 깊게 공부해볼 생각이다. 매일 전날의 데이터를 집계 해야하는 상황일 때 Spring MVC 에서 이를 진행한다면 큰 데이터를 가공하고 저장한다면 해당 서버의 CPU, I/O 의 자원 낭비가 심할 수 있다. 집계 기능을 위해서 API 를 구성하는 것은 낭비이며 처리중 실패했을 때 실패한 데이터부터 다시 처리를 할 수 있어야 하고 누군가가 집계를 실행시켰는데 또 다른 누군가가 실행시켰을 경우에 대비해야한다. 즉 일정 주기로 실행해야 할 때, 실시간 처리가 어려운 대량의 데이터를 처리해야 할 때 Spring Batch 를 사용해야한다. Batch 어플리케이션.......

클린코드 - 주석 [내부링크]

1. 주석은 나쁜코드를 보완하지 못한다 코드에 주석을 추가하는 이유는 코드 품질이 나쁘기 때문이다 따라서 코드만으로 의도를 표현해야한다. 2. 좋은 주석 (예외적 허용 주석) 1. 법적인 주석 2. 정보를 제공하는 주석 3. 의도를 설명하는 주석 4. 의미를 명료하게 밝히는 주석 5. 결과를 경고하는 주석 6. TODO 주석 7. 중요성을 강조하는 주석 3. 나쁜 주석 1. 주절거리는 주석 2. 같은 이야기를 중복하는 주석 3. 오해할 여지가 있는 주석 4. 의무적으로 다는 주석 모든 함수에 Javadocs를 달거나 모든 변수에 주석을 달아야 한다는 규칙은 어리석기 그지없다. 이런 주석은 코드를 복잡하게 만들며, 거짓말을 퍼뜨리고, 혼동과 무질서를 초.......

지그재그로 숫자 출력해보기 [내부링크]

숫자를 지그재그로 출력해보기 ex) 1 2 3 4 5 6 7 14 13 12 11 10 9 8 15 16 17 18 19 20 21 ... i for 문을 열로 생각해서 홀수 짝수 경우를 구해서 홀수 일때 짝수 일때 j for 문의 출력만 반대로 해주면 된다...

트랜잭션 격리수준, 전파옵션 (isolation, propagation) [내부링크]

트랜잭션에 isolation, propagation 의 개념도 있었다. 처음 본거라서 얼른 정리해보려고 한다. isolation (격리 수준) 일관성이 없는 데이터를 허용하도록 하는 수준을 말한다 1. READ_UNCOMMITED (Level 0) - 트랜잭션 중에 처리중이거나 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는걸 허용 (트랜잭션 작업이 완료되지 않았는데 다른 트랜잭션에서 커밋 전 정보를 볼 수 있게 되는 dirty read 현상 발생) ex) 1. A 트랜잭션에서 할인가를 20퍼에서 -> 30퍼로 수정 (아직 커밋 하지 않음) 2. B 트랜잭션에서 할인가를 조회하면 30퍼로 읽어와진다 (dirty read) 3. 30퍼는 너무 할인이 큰거 같아서 rollback 해서 20프로로 바꿨다 4. 하.......

Spring Boot Profiles 환경 설정 파일 여러개로 관리하기 [내부링크]

스프링 환경설정 파일들을 운영에 따라서 dev, local, prod 등으로 나누어서 관리하면 편하다 (properties 파일은 여러개로 나누어야 하지만 yml 파일은 한 파일에서 관리할 수 있다.) Spring Boot 2.4 버전 밑에선 spring.profiles 를 사용했는데 Spring Boot 2.4 이상부터는 deprecated 되었다. 그래서 대신에 spring.config.activate.on-profile 을 사용하면 된다. spring.config.activate.on-profile 에 원하는 local, dev, prod 같은 명칭을 적어서 구분해준다. (한개의 yml 파일에서 설정 구분은 --- 으로 한다) 그리고 spring.profiles.active 에 활성화 시킬 설정이름을 적어주고 실행하면 된다. Test 할 때는 @ActiveProfiles("loc.......

HTTP Request, Response 헤더 값 [내부링크]

HTTP 요청/응답 헤더 HTTP 헤더에는 전송에 필요한 모든 부가정보가 담깁니다. 헤더에는 [Request 헤더] Host -> 가상 호스팅이 있을 경우 원하는 도메인에 요청할 수 있습니다 (필수) Authorization -> 클라이언트의 인증정보를 서버로 전달합니다. Cookie -> 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달합니다. 콘텐츠 네고시에이션 -> 클라이언트가 원하는 표현 요청 Accept : 클라이언트가 선호하는 미디어 타입 Accept-Charset : 클라이언트가 선호하는 문자 인코딩 Accept-Encoding : 클라이언트가 선호하는 압축 인코딩 Accept-Lauguage : 클라이언트가 선호하는 자연 언어 Referer -> 요청된 페.......

Spring RestDocs 에러 An illegal reflective access operation has occurred [내부링크]

어제까지만 해도 restdocs 를 작성하고 나서 build 했을 때 문서가 잘 생성되고 복사도 잘 됐다. 근데 테스트코드를 추가하고 보니까 갑자기 An illegal reflective access operation has occurred 이런 오류가 떴다. 잘못된 리플렉션 작업..? 왜그러지 하고 고민해보다가 갑자기 생각난게 나는 asciidoctor 의 버전을 를 사용하고 있었다. 그래서 혹시나해서 버전을 내려봤다. 그랬더니 빌드가 잘됐다. 엥 머지 버전이 잘 안맞았던건가.. 어제 까지만 해도 잘됐는데 Security 의 UserDetailService 인터페이스를 상속받아서 추가 구현하는 쪽에서 버전이 잘 안맞았던가 싶다.

@WebMvcTest 에서의 Authorization Header 및 jwt 추출 후 Authentication 세팅 [내부링크]

요청이 오면 jwtFilter 에서 jwtProvider.getAuthentication(추출한 토큰 값) 을 통해서 토큰에 있는 필요한 값들을 추출해서 Authentication 객체에 담은 후 SecurityContextHolder 에 있는 context 에 세팅해서 사용하고 있다. @WebMvcTest 를 이용할 때 post("/stores").header("Authorization","Bearer (accessToken)") 이부분의 Authorization header 테스트 로직에서 유효시간이 있는 jwt 를 직접 넣어줄 수 없었기에 Bearer (accessToken) 로 restDocs 문서에 적히도록 해주었더니 jwtProvider.getAuthentication(추출한 토큰 값) 이 부분에서 null 이 들어와서 Authentication 에도 null 이 담겨서 테스트.......

@WebMvcTest 컨트롤러 단위 테스트에서 페이징 테스트 (RestDocs) [내부링크]

통합 테스트가 아닌 단위 테스트에서 Controller 에서 페이징 처리된 로직을 테스트하려면 PageImpl 을 이용해 직접 만들어줘야 한다. 이렇게 직접 DTO 에 값을 넣어주고 모든 세팅이 끝난 후 new PageImpl 을 만들어줘서 Querydsl 에서의 페이징 처럼 직접 Page 를 만들어서 테스트해야한다. RestDocs 는 페이징 처리된 모든 필드(데이터 + 페이징 데이터)들을 적어줘야한다. (restDocs 에서 데이터 배열은 [] 로 표현해주면 된다) 응답 결과

클라이언트에서 받은 데이터들로 동적으로 조회하기 (한번에 주문 처리하기 위해) [내부링크]

@RequestBody 로 받는 DTO 클라이언트에서 메뉴들을 장바구니에 담아서 한번에 주문을 할 때 OrderItemDto 리스트 형태로 request 가 일어나도록 했는데 몇개의 메뉴의 id 가 요청이 올지 모른다. (메뉴를 1개를 시킬 수 도 있고 3개를 시킬수도 있고 10개를 시킬 수 도 있다) 이럴 때는 BooleanBuilder 를 사용해서 or 를 이용해 동적으로 itemId 를 검색하는 쿼리를 만들어주면 된다. 주의해야할 점은 주문 처리할 때 사용자가 request 한 itemId 와 itemId 들 로 DB 에서 조회한 결과들은 순서가 다를 수 있다 (나는 request 받은 데이터를 먼저 정렬을 하고 로직을 실행하는 식의 방식을 선택했다) 이렇게 동적 쿼리를 이용해서 Item 들을 찾.......

WebServer 와 WAS 를 분리하는 이유 [내부링크]

WebServer 정적인 요청을 처리해주는 기능을 하며 WebServer 에는 대표적으로 Apache 와 Nginx 가 있다. Nginx 은 고정적인 한개의 프로세스에서 비동기 방식으로 처리하는 Event Driven 방식이며 매 요청마다 프로세스, 스레드를 생성하는 Apache 보다 좋은 성능을 가진다. 즉 Apache 는 손님이 올 때 마다 테이블을 생성해서 점원들이 테이블들을 돌아다니며 손님을 맞는 반면에 Nginx 는 긴 테이블에 손님들을 앉게하고 한 점원이 손님의 요청을 순서대로 처리하는식 이다 WAS (Web Application Server) WAS 는 WebServer 를 포함하는 개념인데 동적인 요청의 처리를 맡고 있다. 대표적으로 Tomcat, Jetty 등이 있다. (SpringBoot 에는 내부 T.......

Nginx 설치, 설치, 실행 포트 80으로 바꾸기 (Mac) [내부링크]

Nginx 설치 맥에서 설치는 쉽다 (homebrew 가 설치되어 있어야한다) 위 명령어로 nginx 를 설치한다 그럼 이런식으로 설치되기 시작하는데 설치가 끝난 후 위 명령어를 실행해보면 이렇게 nginx 가 성공적으로 설치된 것을 볼 수 있다. Nginx 실행 nginx 를 실행시켜볼껀데 nginx 를 설치하고 나서 설정되어 있는 포트는 8080 이다. (즉 SpringBoot 를 실행하고 있다면 충돌이나서 실행이 되지 않는다) 위 명령어로 nginx 를 실행시키고 localhost:8080 으로 접속해보면 성공적으로 실행된 것을 볼 수 있다. 포트 80으로 바꾸기 nginx 의 관례적으로 약속되어있는 포트는 80 이다. (8080은 충돌날 수도 있다) 터미널에 위 명령어를 입력하면 ngin.......

Spring RestDocs 와 Swagger 같이 사용하기(OpenAPI Spec 사용) [내부링크]

Spring RestDocs 를 사용하면 테스트 코드를 통과해야지 문서가 생성되어서 좋고 테스트 코드에 작성할 수 있어서 편리하다. Swagger 를 사용하면 api 테스트도 해볼 수 있고 ui 또한 이뻐서 보기 좋다. 하지만 swagger 는 controller 단에 어노테이션을 이용해야해서 controller 단이 보기 안좋아진다. -> RestDocs 기반으로 만들어지는 문서 설정을 기반으로 OpenAPI Spec 파일을 생성 하여 Swagger UI 를 띄워서 OpenAPI Spec 파일을 읽는 형식으로 사용 의존성 및 설정 기존의 restDocs 설정에 open api spec을 를 추가해서 설정해야한다. openapi 버전 3을 이용할것이고 안에 있는 data들은 입맛에 맞춰 수정하면 된다. 테스트 코드 위에.......

Resilience4J 를 통한 Microservice 들의 통신간 에러 처리(CircuitBreaker) [내부링크]

user-service, order-service, product-service 가 있다. user-service 에서 회원 정보를 불러오면 Feign Client 으로 연결된 order-service 에서 주문 목록을 받아와야 하는데 order-service 에서 오류가 난다면 user-service 에서도 500에러가 나게 된다. 즉 user-service 의 작업에선 다른 마이크로서비스들에서의 오류가 user-service 에 영향을 끼치면 안된다. -> user-service 외에 마이크로서비스에서의 문제가 발생 했을 때 user-service 로 요청을 전달하면 안된다. (Feign Client 을 통한 다른 마이크로서비스들과의 통신에서 오류가 발생했을 때 우회해서 정상적인 데이터를 보여줄 수 있게 설정을 해놓아야한다) CircuitBreaker 란.......

클린코드 - 함수 [내부링크]

1. 작게 만들어라 함수를 만드는 첫번째 규칙은 작게 만드는 것이다. if 문 else 문 while 문 등에 들어가는 블록은 한 줄이 적당하다는 의미이다. -> 중첩 구조가 생길 만큼 함수가 커져서는 안된다. (따라서 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서는 안된다.) 2. 한 가지만 해라 함수는 한 가지를 해야하고, 그 한 가지를 잘 해야하고, 그 한 가지만을 해야 한다. (함수의 이름을 다른 의미 있는 이름으로 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.) 3. Switch 문을 사용할 때는 주의해라 위 함수에는 문제가 있는데 1. 함수가 길다. (새로운 직원의 유형을 추가하면 길어진다) 2. 한 가지 작업을 수행하지 않는다. 3........

[오류] failed to lazily initialize a collection of role: could not initialize proxy - no Session [내부링크]

Lazy 사용시 같은 트렌젝션이 아닐시 프록시를 초기화 하지못해 발생하는 오류이다. 1. LAZY 를 EAGER 로 바꿔주기 2. @Transactional 을 사용해 같은 트랜잭션으로 묶어주기 JPA 사용시 LAZY 는 필수 이므로 2번을 선택해서 해결해야한다. @Transactional 은 필수

일대다 2개 이상 자식 엔티티 페치 조인 MultipleBagFetchException 발생시 (N + 1 문제) [내부링크]

문제 상황 자식 테이블이 2개 이상은 아니지만 @OneToMany 가 2번 있어서 2개의 페치조인을 해야하는 상황의 예시다. 즉 회원 데이터를 뽑는데 팔로잉 리스트와 팔로워 리스트를 같이 한번에 뽑고 싶었다. 조건문은 제외하고 일단 페치조인이 2개가 되는지 테스트해봤는데 안된다고 저리가라고 했다. (둘 이상의 컬렉션의 페치조인은 불가능하다) (또한 컬렉션을 페치조인시 페이징 API 를 이용할 수 없다) 그러면 페치조인을 사용하지 못하므로 그냥 불러오면 User 조회쿼리 1번 User 의 수만큼 팔로잉 조회 쿼리, 팔로워 조회쿼리가 나간다. (테스트로 회원 5명을 생성하고 조회를 했더니 총 쿼리가 11번 나갔다) 조회된 부모의 수만큼 자식 테.......

Spring Boot 의 기능 [내부링크]

Spring Boot 는 Spring 을 편리하게 사용할 수 있도록 지원해주는 기술 이다. - 예전에는 Tomcat 서버를 별도로 설치하여 Spring 과 연동을 했어야 했는데 Spring Boot 는 내장 Tomcat 을 사용하므로 별도의 웹 서버를 설치하지 않아도 된다. - 예전에는 어떤 라이브러리를 사용하러면 그에 관련된 모든 것들을 가져와야 했는데 Spring Boot 는 손쉬운 빌드 구성을 위한 starter 종속성을 제공하여 (spring boot starter data jpa, spring boot starter web) 이런식으로 하나만 가져오면 필요한 나머지 관련 라이브러리들을 자동으로 가져와준다. - 예전에는 사용할 외부 라이브러리의 버전과 Spring 프레임워크의 버전이 잘 안맞으면 설정하기 힘.......

@OneToOne 에서의 지연 로딩 불가능 문제 [내부링크]

OneToOne 에서 Lazy 로딩이 안되는 경우가 있다. (이거 때문에 n + 1 이 계속 일어났다....) Lazy 로딩으로 설정되어있는데 아니 자꾸 쿼리가 n + 1 이 나가길래 왜그러지? 하고 찾아보는데 결국 @OneToOne 에서 오는 문제였다.. 연관 관계의 주인에서 조회를 하면 Lazy 로딩이 잘 작동하는데에 비해 주인이 아닌 쪽에서 조회를 해보면 n + 1 문제가 발생했다 프록시 기능의 한계로 Lazy 로 설정해도 항상 Eager 로 조회가 되는 문제가 있다. 따라서 @OneToOne 을 @OneToMany 를 수정해줘도 되는 테이블 관계라서 양방향으로 바꿔줬다 만약에 OneToOne 을 꼭 써야하는 상황이라면 연관 관계 주인쪽에서 조회를 하거나 직접 DTO로 조회해서 사용해.......

@Builder 사용시 필드값 초기화가 되지않는 문제 [내부링크]

이렇게 클래스 위에 Builder 패턴을 쓰고 @AllArgsConstructor 를 사용시 memberList 와 ticketList 가 new ArrayList 로 초기화가 되지 않았다. 그래서 jpa 에서 양방향 연관관계 세팅을 해줄 때 MemberList 에서 NullPointException 이 떴다. 이렇게 생성할 필드명을 지정한 생성자를 만들어 @Builder 를 사용하게되면 정상적으로 ArrayList 로 초기화가 되었고 NPE 도 해결할 수 있었다. 무분별하게 클래스 위에 쓰지말고 생성자를 만들어서 @Builder 를 사용해야 한다.

HTTP 응답코드 [내부링크]

2xx 200 : OK 요청 성공 201 : Created 요청 성공후 리소스 생성 202 : Accepted 요청이 접수 되었으나 처리가 완료되지 않음 204 : No Content 요청은 성공했으나 응답에 표시할 내용이 없음 3xx (리다이렉트) 301 : Moved Permanently 서버가 301 응답 헤더의 Location 에 새로운 URI 을 보내면 클라이언트가 GET 으로 새로운 URI 로 요청을 보낸다. (메시지 바디 데이터는 없어짐) 302 : Found 리다이렉트시 요청 메서드가 Get 으로 변하고 본문이 제거 될 수 있음 303 : See Other 302 와 기능은 같고 리다이렉트시 요청 메서드가 Get 으로 변경 304 : Not Modified 캐시를 목적으로 사용하며 클라이언트가 캐시가 만료된 것 같으니까 다시 파.......

Apache Kafka 동작 방식 [내부링크]

Apache Kafka 란? 오픈 소스 메세지 브로커 프로젝트이며 링크드인에서 개발되었다. 실시간 데이터 피드를 관리하기 위해 통일된 높은 처리량, 낮은 지연 시간을 지닌 플랫폼이다. 메시지를 Write 하는 주체를 Producer 메세지를 Read 하는 주체를 Consumer 라고 한다. Consumer 가 자신이 원하는 메세지를 Pull 하는 방식이라서 자신이 필요한 메세지만 가져오므로 최적의 성능을 낼 수 있다. Broker 는 Kafka 서버를 말하며 Broker 중 한개는 Controller 의 역할을 한다. (Broker 에게 파티션 할당 수행, 모니터링) -> Kafka Cluster 는 3개 이상 Broker 로 구성되어 있다. Zookeeper 는 Broker 에 의해 분산처리된 정보들을 관리해주며 메.......

Apache Kafka 로 Producer, Consumer, Topic 데이터 전송 테스트 해보기 [내부링크]

Zookeeper, kafka 서버 구동 Topic 생성 quickstart-event 라는 Partition 1 인 Topic 생성 Topic 리스트 확인 Topic 상세 정보 보기 Producer 실행 Consumer 실행 (from beginning 은 모든 메세지를 처음부터 표시하려고) 간단한 Producer, Consumer 테스트 Producer 로 메세지를 보내 quickstart-event 라는 Topic 을 구독하고 있는 Consumer 에게 메세지가 오는걸 간단하게 테스트 해보았다.

Kafka Connect 개념, 설치 [내부링크]

Kafka Connect 란 Kafka Connect 란 Data Source 와 Kafka 를 연결해주는 매개체이다. Producer : Source Connector (왼쪽 Kafka Connect) Consumer : Sink Connector (오른쪽 Kafka Connect) Data 를 export/import 할 수 있으며 코드없이 Configuration 으로 Data 를 이동시킬 수 있다. (Rest API 를 이용) kafka connect 설치 및 설정 주소에 입력해서 Kafka connect 를 다운받는다. MariaDB 를 이용하기 위해선 jdbc connector 가 필요한데 다운받아준다 그리고 두가지 작업을 해야하는데 1. etc/kafka/connect-distributed.properties 파일 마지막에 아래 plugin 정보 추가 (kafka connect 의 connect-distributed.properties 수정) 2. Jdbc.......

Kafka connect 로 Source connect, Sink connect 생성 및 테스트 해보기 [내부링크]

kafka connect 서버 실행 zookeeper 서버와 kafka 서버를 실행시키고 kafka connect 서버를 실행시키면 Topic 에 connect-configs, connect-offsets, connect-status 가 추가된 것을 볼 수 있다. kafka connect 를 Rest API 로 생성 및 삭제 가능 kafka connect 서버 주소는 로컬에서 localhost:8083 이다 [GET] /connectors – 모든 connector 를 조회한다. [GET] /connectors/{name} – {name}을 갖는 connector 의 정보를 조회한다. [POST] /connectors – 커넥터를 생성한다, Body쪽에는 JSON Object 타입의 커넥터 config정보가 있어야한다. [GET] /connectors/{name}/status – 이 connector 가 running인지, failed인지 paused 인지 현재.......

요즘 드는 생각 [내부링크]

취업 준비로 코딩테스트를 준비하고 있는데 Spring Cloud 마이크로서비스 아키텍쳐 공부가 너무 재밌다.. 코테부터 통과해야하는데 요즘 MSA 공부만 하고있다.. 지금은 또 Redis 에 깊게 배우고 싶어서 우아한 Redis 를 보고 있다.. Kafka 에 대해 깊게 배워보고 싶고 Jenkins 로 배우고 싶고 Spring Batch 도 배우고 싶고 TDD 도 배우고 싶지만 개인 공부도 있고 학교 프로젝트, 외부 프로젝트, 코테준비 등 할게 너무나 많다... (Clean Code 라는 책도 샀다..! 하루에 짬내서 조금씩 읽어봐야겠다) 지금 공부하는건 실무에 비하면 아무것도 아닐꺼고 당연히 시간이 지나면 공부했던걸 까먹을 수도 있겠지만 나중에 다시 복습하면 더 빨리 머리.......

우아한 Redis 후기 및 정리 [내부링크]

요즘 Redis 에 깊게 살펴보고 싶어서 평소 즐겨보는 우아한 Tech 에 있는 강대명님의 우아한 Redis 를 시청했다! 시청하고 중요한 부분을 정리해봤다 Cache 란? Cache 는 나중에 요청된 결과를 미리 저장해두었다가 빠르게 서비스를 해주는 것을 의미 (Factorial 같은 다이나믹 프로그래밍도 같은 목적) 보통 일반적으로 많이 쓰는 패턴 다른 패턴 인메모리가 Disk 보다 읽기 쓰기가 당연히 빠르다. 그래서 데이터들을 캐시에 저장해두었다가 특정 시점마다 DB 에 저장하는 방법이다. insert 쿼리를 1번씩 500번 날리기 vs insert 쿼리를 500개를 붙인걸 1번 날리기 이걸 하면 후자가 상상도 못할정도로 빠르다. -> 이렇게 하는게 Write Back .......

kafka 를 사용해 order-service, product-service 데이터 동기화해보기 (Consumer, Producer) [내부링크]

동작 흐름 주문을 했을 때 kafka 를 통해 상품의 재고가 빠지는 Microservices 끼리의 데이터 동기화를 해보려고 한다. 의존성 설정 Kafka Consumer 설정 Kafka Consumer 전용 설정 파일을 작성한다. Kafka Consumer 메시지 처리를 하는 메서드를 작성한다 Producer 가 topic 에 메세지를 전달하면 등록해놨던 리스너가 이를 감지하여 이 메서드가 실행되고 topic 에 있던 데이터들을 받아 그 중 productId 와 count 값을 통해 상품 재고 값을 수정해준다 (productId : 상품 고유 pk, count : 주문수량) Kafka Producer 설정 Producer 전용 설정 파일을 작성한다. ResponseOrder dto 를 직렬화 하여 topic 에 보낼 수 있게 하는 메서드 (productI.......

[오류] If you are using MockMvc did you use RestDocumentationRequestBuilders to build the request? [내부링크]

Spring restDocs 사용중 이런 오류가 떴다. java.lang.IllegalArgumentException: urlTemplate not found. If you are using MockMvc did you use RestDocumentationRequestBuilders to build the request? pathparameter 를 추가하고 생긴 오류인데 공식 문서를 찾아보니까 request 를 mockMvcRequestBuilders 를 사용하지말고 restDocumentionRequestBuilders 를 사용하라고 했다. 즉 원래는 위에 처럼 사용했는데 pathParameter 를 사용하는 요청 에선 RestDocumentationRequestBuilders 를 static 임포트해주면 된다.

Spring RestDocs 이용해서 api 문서 만들기 [내부링크]

RestDocs 는 Controller 테스트 하면서 같이 코드를 작성해 api 문서를 쉽게 작성하게 해주는 도구다 의존성 추가 및 설정 빌드하면 build 에 asciidoc/html5 폴더에 html 문서가 생기는데 이걸 resources/static/docs 로 복사해서 자동화를 해주었다. 테스트코드 + RestDocs 회원이 어떤 상대를 팔로잉 하는 테스코드이다. pathParameters 값을 restDocs 에 이용하려면 RestDocumentRequestBuilders 의 post, get 메서드를 이용해서 테스트 해야한다. 1. pathParameter 값에 대한 문서 작성 코드 2. request 필드들에 관한 문서 작성 코드 3. response 필드들에 관한 문서 작성 코드 이렇게 작성하면(위 예제에선 Authorization 헤더는 작성 하.......

Microservice 간 통신 (RestTemplate, FeignClient, ErrorDecoder 예외처리), 데이터 동기화 문제 [내부링크]

Microservice 간 통신 종류 마이크로서비스간의 통신은 두가지로 나뉜다. 동기(Synchronous) : HTTP Request, Response 방식 (Rest Template, Feign Client) 비동기(Asynchronous) : Subscribe 방식 (AMQP, Kafka) Rest Template 사용해서 통신 사용자 정보를 조회할 때 주문 목록도 같이 조회하려고 한다. user-service, order-service 는 나누어져 있으므로 user-service 에서 userId 를 조회한 후 order-service 로 userId 를 통해 주문 목록을 조회해야 한다. 먼저 Rest Template 을 빈으로 등록한다. @LoadBalanced 를 사용하면 yml 설정파일에서 url 을 등록할 때 서버 ip주소를 명시안하고 Eureka 서버의 마이크로서비스 이름을 사용할 수.......

Spring Cloud 실행 순서 체크 [내부링크]

RabbitMQ Server H2 console (Local Test) Spring Cloud Config Server Eureka Server (service-discovery) Microservices Gateway-service

클린 코드 - 의미 있는 이름 [내부링크]

코드를 더 효율적이고 좋게 짜고 싶어서 Clean Code라는 책을 구매해서 읽으면서 공부하면서 정리를 해보았다. 1. 의도를 분명히 밝혀라 d는 아무런 의미가 드러나지 않지만 밑에 변수명들은 의도가 들어난다. (이름만 고쳐도 함수가 어떤 동작을 하는지 이해하기 쉬워진다) 2. 그릇된 정보를 피하라 이렇게 코드를 작성한다면 O과 0, 1과 l을 구분하기가 힘들어진다. 또한 여러 계정을 그룹으로 묶을 때, 실제 List가 아니라면 accountList라고 명명하지 않는다. 3. 검색하기 쉬운 이름을 사용하라 위 처럼 코드를 짜면 검색도 불가능할 뿐만 아니라 10000, 5가 무슨 의미인지 알기가 쉽지않다. 이름만 잘 지어주면 함수가 길어지지만 찾기가 쉽.......

Spring Cloud 데이터 동기화 문제 [내부링크]

데이터 동기화 문제란? 주문을 하는 order-service 가 존재하며 트래픽이 많아서 order-service 의 인스턴스를 2개 만들었다고 가정해보겠다. order-service 는 각각 다른 포트번호를 가지고 있으며 DB 도 다르게 가지고 있다. 그러면 order-service 로 들어온 주문 데이터도 분산되어 저장되게 된다. (인스턴스1, 2 에 나뉘어서 저장된다) 예를 들면 회원이 주문을 3번 했다고 할 때 3개의 주문 데이터가 order-service 인스턴스 1에 2개 order-service 인스턴스 2에 1개가 저장되었다고 한다면 회원이 주문목록을 조회 했을 때 order-service 인스턴스 1 에 조회가 됐을 땐 주문 목록이 1개 order-service 인스턴스 2 에 조회가 됐을 땐 주문 목.......

문자열 팁 정리 [내부링크]

1. 문자열 하나씩 떼어서 검사해야 할때 -> 문자열을 char 배열로 바꿔서 접근 2. 대문자인지 아닌지 소문자인지 아닌지 검사할 땐 char 로 띄어서 Character 클래스 사용 (알파벳 검사도 할 수 있다) 3. 문자열을 붙이거나 떼어낼 때는 StringBuffer 나 StringBuilder 이용 StringBuffer -> 멀티쓰레드 안전 (동기화 지원) StringBuilder -> 단일쓰레드 최적화 sb.append(값) - StringBuffer, StringBuilder 뒤에 값을 붙인다 sb.insert(인덱스, 값) - 특정 인덱스부터 값을 삽입한다 sb.delete(인덱스, 인덱스) - 특정 인덱스부터 인덱스까지 값을 삭제한다 sb.indexOf(값) - 값이 어느 인덱스에 들어있는지 확인한다 sb.substring(인.......

에라토스테네스 알고리즘 (서로소 구하기) [내부링크]

에라토스테네스 알고리즘 원래 서로소는 최대공약수를 구해서 값이 1이 나오면 서로소이다. -> 구하고자 하는 수 마다 반복문을 이용해 최대공약수를 구하면 시간 복잡도는 O(n) 유클리드 호제법은 a, b 의 최대공약수는 b 와 a%b 의 최대공약수랑 같다 -> 유클리드 호제법을 이용해 최대공약수를 구하면 시간 복잡도는 O(logn) 에라토스테네스 알고리즘은 나열되어 있는 숫자를 2부터 시작하여 각 배수를 지우는 개념 -> 지우는거 말고 1, 0 처럼 간단하게 확인 시간복잡도는 O(logn logn) 배열의 인덱스를 이용해 에라토스테네스 알고리즘 적용 설명 자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요.......

Local Git 저장소를 Remote 하기 [내부링크]

위 명령어를 사용해 지금 git 저장소가 remote 되어있는지 확인한다. 아무것도 안나오면 remote 가 되지 않은것이다. 깃허브에서 레포지토리를 만든 후 주소를 복사한다. 복사한 주소를 위 명령어에 붙여 사용한 후 remote 가 되어있는지 확인해보면 이렇게 뜨면 된 것 이다. Remote 후 Push 깃이 master 로 되어있는데 master 로 main 으로 default 가 변경되었다 으로 master 를 main 으로 변경해준다. Remote 한 후 처음 push 를 하려면 orgin과 현재의 main 을 동기화 시켜줘야하는데 위 명령어를 통해 가능하다. (이 후에는 그냥 git push 를 이용하면 된다.) 하지만 이름을 변경해서인지 fetch 오류가 뜨는데 이거는 기존의 내용이 유실될.......

[오류] @Builder Deserialize 시 생성자 오류 [내부링크]

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.msa.userservice.response.ResponseOrder` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) Json 형식의 데이터를 내 class 에 담는 과정을 Deserialize 라고 한다. 이 과정에서 오류가 났다. @Builder 를 json 데이터를 담을 때 사용하면 생성자 문제로 @AllArgs 와 @NoArgs 를 같이 써줘야한다. 전에 썼던 포스팅을 참고하자

[오류]Spring Cloud Config Server - NoSuchLabelException: No such label: master [내부링크]

org.springframework.cloud.config.server.environment.NoSuchLabelException: No such label: master 이라는 오류가 떴다 Spring Cloud Config Server 사용시에 Git 에 마스터 브랜치가 없어서 나는 오류였다. Git 레포지토리를 생성하면 master 대신 main 으로 생성되게 바뀌었는데 스프링에서는 아직 master 를 찾는것 같다. 그래서 생기는 오류다. 따라서 Git main 브랜치 말고도 master 브랜치를 추가로 생성해서 main 내용을 push 해줬더니 해결됐다.

Spring Cloud Config 적용해보기 (Spring Boot Actuator, Profiles Configuration) [내부링크]

Spring Cloud Config 란? 분산 시스템에서 서버, 클라이언트에 필요한 설정 정보(application.yml) 을 외부 시스템에서 관리하기 위한 방법 -> 각 각의 서비스를 다시 빌드 하지 않고 적용할 수 있다. DEV, UAT, PROD 에 맞는 환경 설정 가능 (Git 이용 가능, 암호화된 data 이용 가능, local 파일 이용 가능) application.yml application-name.yml application-name(profile).yml 이런식으로 설정 파일 이름을 다르게 하여 Spring Cloud Config 를 이용해 원하는 설정 파일을 적용시킬 수 있다. (profile) 에 원하는 글자를 넣을 수 있으며 Spring Cloud Config 에서 profile : ~~ 로 적용시킬 수 있다. Spring Cloud Config 프로젝트 생성.......

Spring Cloud Bus 적용 (RabbitMQ 설치 및 적용) [내부링크]

Spring Cloud Bus 란? 분산 시스템의 각각의 마이크로서비스들을 경량 메세지 보로커에 연결시키고 각각의 상태 및 구성이 변경되면 연결된 모든 마이크로서비스들에게 전달시켜준다(Broadcast) cloud config server 에 연결되어 있는 아무 마이크로서비스에게 한번 bus refresh post 요청을 하면 연결되어있는 모든 마이크로서비스에게 변경된 사항을 update 시켜준다. RabbitMQ vs Kafka RabbitMQ (AMQP) 는 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜이다. 메세지 지향적이며 신뢰성, 보안이 뛰어나다. Kafka 는 Apache Software Foundation 이 개발한 오픈소스 메세지 브로커 프로젝트이다. 분산형 스트리밍 플랫폼이며 대.......

TDD 커스텀 템플릿 설정 [내부링크]

원하는 양식으로 코드를 작성하고 자바코드에서 작동하게 설정해주면 끝이다

“Will not add file alias '~~~' ('~~~' already exists in index)” 오류 [내부링크]

커밋할시에 수정하기 전 파일 이름과 수정후의 파일 이름의 대소문자 ignorecase 때문에 생기는 오류이다. 해당 git 레포지토리 폴더로가서 터미널에 이렇게 적용시키면 해결된다

테스트 코드 작성을 생활화하자 [내부링크]

일반적으로 테스트 코드를 먼저 작성하고 테스트 통과 코드를 작성 한 후 코드를 리펙토링 하면서 개발을 하는게 TDD(Test Driven Development) 이다 하지만 이러면 개발 시간이 늘어나는 단점이 있지만 결함이 낮아지고 유지보수성도 올라간다. 테스트 코드 작성을 한다면 빌드되는 과정에서 로직상 문제가 있을 경우 빌드 오류가 나기 때문에 유용하다! 마이크로서비스 공부가 끝나면 구매한 TDD 책을 읽어보면서 공부해 봐야겠다! TDD가 힘들더라도 테스트 코드 작성은 꼭 하자!

Spring Cloud Gateway RewritePath 사용해 uri 수정 [내부링크]

RewritePath 를 추가해 이렇게 작성하면 원래는 /user-service/users 로 매칭되는 요청이 /users 로 바뀌어서 요청이 전달된다. user-service 서버의 ip주소, 포트번호 에서만 작동한다. gateway 로 접근은 /user-service/** 유지

Spring Cloud Gateway + Microservices + Eureka 연동, 로드 밸런싱 처리 해보기 [내부링크]

Spring Cloud Gateway, Service Discovery(Eureka) 통신 흐름 1. 클라이언트에서 request 를 보내면 2. Gateway 에서 Eureka 서버로 request 의 서버가 어딨는지 물어보고 3. Eureka 서버에선 Gateway 로 서비스 위치를 반환하며 4. Gateway 에서 해당 서비스로 request 를 보낸다. 5. 해당 서비스에서 Gateway 로 response 를 보낸다. 6. Gateway 에선 Client 로 받은 resonse 를 보낸다 Spring Cloud Gateway, Microservices, Eureka 연동 gradle 에 eureka-client 의존성이 추가 되어야한다. first-service, second-service, gateway-service 에 eureka-client dependency 를 추가 하고 application.yml 에 Eureka 서버에 등록하는 작업을 각.......

Spring Cloud Gateway 적용, Filter(Custom, Global, OrderedGatewayFilter) 적용해보기 [내부링크]

앞에서 적용한 Netflix zuul 은 비동기 처리에 호환성이 떨어지고 spring 프레임워크에 대한 호환이 떨어져서 spring 에서 자체적으로 gateway 를 만들었다 (zuul 은 다음 버전에 없어질 수도 있다) 그래서 spring cloud gateway 를 적용해보려고 한다. Spring Cloud Gateway 적용 gradle 과 application.yml 을 설정한다. id = 서비스를 구분하는 id 설정 predicates = 조건 입력 가능 - Path = 사용자가 입력하는 path uri = path 로 요청이 오면 설정한 uri 로 요청이 가게한다 Netflix Zuul 과 Spring Cloud Gateway 의 맵핑 차이점 [Netflix Zuul 적용 했을 때 FirstServiceController] Netflix Zuul 에선 /first-servi.......

[HTML] CSS 기초 다시 알아보기2 [내부링크]

padding, margin, border 알아보기

Spring Cloud Netflix Zuul 적용 해보기 [내부링크]

API Gateway Service 는 사용자가 설정한 라우팅 설정에 따라서 각각 엔드포인트로 클라이언트 대신 요청하고 서버에게 응답을 받아 다시 클라이언트한테 전달해주는 프록시 역할을 한다. Netflix Zuul 적용 시켜보기 (다음 버전에서 사라질 수 있음) 테스트를 위해 first-service, second-service 두 개의 프로젝트를 만들어 줬다. 하나는 포트 8081 나머지는 8082 로 설정 컨트롤러도 구분시켜줬다. 이렇게 8081, 8082 로 들어가보면 각각의 서비스를 호출하는것을 볼 수 있다. 이제 Zuul 을 이용해 API Gateway 를 테스트 해봐야하기 때문에 Zuul 을 의존 받은 zuul-service 라는 프로젝트를 생성해줬다. gradle 설정한 후 그리고 @EnableZuul.......

도메인 설계시 팁 [내부링크]

무분별한 객체 생성을 막기위해 접근지시자 protected인 기본 생성자 설정해야한다. @Data는 너무 많은 어노테이션이 추가된다. 사용하지말자 @Setter는 절대 사용하지말고 메서드를 생성해 바꿀 필드만 지정해서 사용하자 @ToString을 쓰면 무한 참조가 일어날 수 있기 때문에 사용하려면 @ToString(of = {""})를 사용하자 @Builder는 클래스위가 아닌 따로 생성자를 만들어줘서 사용하자 api 설계시 entity 반환이 아닌 dto를 만들어서 반환해야한다 entity간의 연관관계 설정시 무조건 지연로딩을 이용하자 (단 MemberRole 같은 권한은 종류도 적고 자주 사용하므로 즉시로딩으로 하는게 좋을 경우가 있다) @CreationTimestamp.......

지도 api 이용할시 검색 과정에서 지도 축소 확대 여부에 따른 서버에서의 데이터 가져올 때의 고민 [내부링크]

네이버 지도에서 카페를 검색했을때 카페의 정보들이 지도상에 나온다. 지도를 확대해서 검색하면 확대된 위치의 카페 정보들이 나온다. 지도를 축소해서 검색하면 축소된 위치의 카페 정보들이 나온다. 네이버 서버에 등록된 매장 데이터들중에 카페라는 키워드인 데이터들이 나오는 것같은데 지도를 축소, 확대 시켰을 때 뿌려주는 데이터는 어떤 기준으로 DB에서 가져오는건지 모르겠다. 네이버 지도에서 카페를 검색한 uri인데 보면 search/카페 로 검색한 후 c=위도,경도 값이 오고 지도의 축소 확대여부에 따라 13,0,0,0,dh의 13이라는 숫자가 바뀐다. 만약에 직접 서버를 구축하고 지도 api를 이용하고 카페라고 검색을 했을 때 나의.......

Cloud Native,12factors, Microservices [내부링크]

2010년대 이후부터 it 시스템은 Antifragile 또는 Cloud Native Architecture 형태로 발전 되어 왔다. Cloud Native Architecture 특징 - 시스템의 수평적 확장에 유연하며 확장된 서버로 시스템의 부하 분산, 가용성이 보장된다. - 시스템 or 서비스 어플리케이션 단위의 패키지(컨테이너 기반) - 서버와 리소스들을 모니터링 도구를 이용해 확인 가능 - 서비스 생성-통합-배포, 비지니스 환경 변화에 대응 시간 단축 - 분활 된 서비스 구조, 무상태 통신 프로토콜 - 서비스의 추가와 삭제를 자동으로 감지 - 변경된 서비스 요청에 따라 사용자 요청 처리(동적 처리) - 특정 서비스에 오류가 발생해도 다른 서비스에 영향을 주지 않는다. (어떤.......

Spring Cloud 란? [내부링크]

MSA에 대해 자세한 포스팅을 했는데 이걸 먼저 보는것을 추천한다! Spring Cloud 란 Spring Cloud 란 Microservices 의 개발, 빌드, 배포, 운영에 필요한 아키텍처를 쉽게 구성할 수 있게 도와주는 Spring Boot 기반 프레임워크 이다 (Spring Cloud 를 사용하려면 Spring Boot 는 필수) Spring Cloud 를 이용하면 MSA를 위한 환경설정, 서비스 검색, 라우팅, 프록시 등 분산 시스템을 빠르게 설정할 수 있다. Spring Cloud 를 이용한 어플리케이션을 개발시 자주 사용되는 기술 환경 설정은 Spring Cloud Config Server 를 통해 개발을 하며 이를 통해 다양한 Microservices 에서 사용하는 설정 정보들을 Git 에다가 집어 넣을 수 있다. -> Mi.......

Spring Cloud Netflix Eureka 에 한 service 의 instance 를 여러개 등록 해보기 [내부링크]

Spring Cloud Netflix Eureka 흐름 PC 가 한대라면 마이크로서비스 인스턴스 마다 포트번호가 다르게 설정되야한다. (PC 가 여러대라면 같은 포트 이용 가능) 각각의 마이크로서비스 는 Eureka 서버에다가 등록이라는 작업을 먼저 해야한다. 이 마이크로서비스 들을 사용하고 싶은 클라이언트에 의해 요청이 일어나면 API Gateway 에 필요한 요청이 전달되며 먼저 Service Discovery 에 전달이 되고 필요한 요청에 대한 마이크로서비스의 위치를 반환하며 (위치 전달) Load Balancer 에 의해 요청이 마이크로서비스로 가고 그에 맞는 결과 값이 반환 된다 (요청 전달 + 결과 값 반환) Eureka 서버 설정 gradle 설정과 @EnableEurekaServer 의 어.......

Spring Security 인증 인가 예외 처리(AuthenticationEntryPoint, AccessDeniedHandler) [내부링크]

Spring Security는 인증 인가 실패시 FilterSecurityInterceptor가 2가지의 예외를 발생시킨다 1. 인증 인증 예외가 생기면 AuthenticationException을 호출시킨다 -> AuthenticationEntryPoint 인터페이스로 커스텀이 가능하다. 아애 json response를 만들어 커스터마이징했다. 2. 인가 인가 예외가 생기면 AccessDeniedException을 호출시킨다 -> AccessDeniedHandler 인터페이스로 커스텀이 가능하다. 얘도 아애 json response를 만들어 커스터마이징했다. SpringConfig 다 작성후 SpringConfig에서 exceptionHandling() 뒤에 장착해주면된다.

Jwt 예외처리(MalformedJwtException, ExpiredJwtException, UnsupportedJwtException, SignatureException) [내부링크]

Spring Security 필터에서의 예외는 @ExceptionHandler로 잡히지 않는다. (필터 단이 아닌 BadCredentialsException 은 잡힌다) 왜냐하면 Spring Security는 Spring 이전에 Filter 처리가 되므로 DispatcherServlet 까지 가지 않기 때문이다. Security에는 각종 Filter를 상속받고 Filter 처리를 직접 작성할 수 있는데 여기서 catch 로 Exception 처리를 해줘야한다. 이런식으로 예외처리가 날때 json 형식으로 response 처리해주면 된다.

spring security와 jwt를 이용한 accessToken, refreshToken 발급 [내부링크]

저번에 만들어본 jwt 로그인은 많은 security의 클래스들을 구현해서 복잡하였다. 그래서 최적화해서 다시 구현해보았다. accessToken refreshToken 흐름 Security 로그인 처리 흐름 흐름을 ppt로 정리해보았다. 밑에서 더 자세히 설명하겠다 JwtProvider jwt를 생성, 추출의 기능이 있는 클래스이다 (jwt에 지식들은 전에 설명한 적이 있으므로 생략) seceryKey, accessToken 유효seconds, refreshToken 유효seconds는 application.yml에 정의하여 사용한다. (토큰 생성에 필요한 유효시간은 밀리세컨드가 필요하므로 정의한 값은 초 단위므로 * 1000을 해주었다.) secertKey는 빈 생성될 때 암호화돼서 jwt에 들어간다. generateToken()으로 토.......

HTTP 메서드(GET, POST, PUT, PATCH, DELETE) [내부링크]

GET (Read) 서버에 전달하고 싶은 데이터를 쿼리파라미터(?name=beomjun&age=26)를 사용해 전달한다. 주로 읽거나 검색하는 용도로 많이 사용된다. (GET은 캐시가 가능하다) GET /members/1 -> 1번 회원을 조회 POST (Create) 메세지 바디에 데이터를 담아서 서버에 데이터를 보낸다. GET과는 달리 메세지 바디에 데이터를 담아서 보내므로 url 상에 데이터가 표시되지 않는다. 주로 생성으로 많이 사용하는데 생성 뿐만 아니라 배달 시작, 배달 완료 처럼 프로세스의 상태가 변경되는 경우에도 사용된다. 또한 조회용인데 GET 을 사용하기 어려운경우 에도 사용된다. api 설계에선 리소스 단위(member, order, board..) 로 설.......

HTTP API 설계 예시(URI 설계 rest, form) [내부링크]

회원 관리 회원 목록 : /members [GET] 회원 등록 : /members [POST] -> 서버에서 리소스uri를 만들어서 전송해줌(/members/1 Created) 회원 조회 : /members/{id} [GET] 회원 수정 : /members/{id} [PATCH, PUT, POST] 회원 삭제 : /members/{id} [DELETE] 파일 관리 파일 목록 : /files [GET] 파일 조회 : /files/{filename} [GET] 파일 등록 : /files/{filename} [PUT] -> 기존 파일이 있으면 지우고 다시 올려야하기 때문 -> 클라이언트가 리소스 uri를 알고 있어야 한다. 파일 삭제 : /files/{filename} [DELETE] 파일 대량 등록 : /files [POST] HTML 폼 사용시 회원 관리 회원 목록 : /members [GET] 회원 등록 폼 : /members/ne.......

Springboot, Redis 간단하게 맛만 보기 [내부링크]

Redis 란?(Remote Dictionary Server) 보통 여러 서버에서 같은 데이터를 공유할 때 사용하며 Key, Value 기반인 Hash, Set, Sorted Set, List 등을 지원하는 인메모리 데이터 저장 방식의 DB다. 일반적으로 RDMS에서 select 하여 데이터를 가져오는 것 보다 Memory에서 읽을 때가 1000배 가량 빠르다. 하지만 서버 장애가 생길 경우 인메모리 저장 기반이므로 데이터의 유실이 생기게 된다. 이러한 문제는 대책을 세워 관리해야한다. Gradle 의존성을 추가해서 jpa랑 같이 사용할 수 있으며 @RedisHash 로 Redis의 Hash를 이용하여 엔티티처럼 사용할 수 있다. restTemplate으로 직접 세팅 해주는 것도 있는데 CrudRepository를 상속받아서 사용.......

[오류] security config 무한 리다이렉트 [내부링크]

시큐리티 Config 설정중에 Controller의 로그인 페이지가 계속 무한 리다이렉션 오류가 떴다. 눈뜨고 찾아본 결과 간단하다. 지금 보면 어떠한 요청이 일어나려면 권한이 필요하다 라고 선언되어있다. ->anyRequest().authenticated() 권한이 필요하다는 설정 밑에에 loginPage("/login") 이 선언되어있다. 이거는 로그인페이지를 시큐리티가 제공하는 페이지를 안쓰고 직접 쓰겠다는건데 어떠한 anyRequest().authenticated() 라는 설정의 코드 밑에 loginPage가 위치하고 있기에 -> "/login" 페이지를 로그인으로 사용하겠다 -> 권한 필요(security) -> "/login" 페이지를 로그인으로 사용하겠다 -&.......

Spring Security OAuth2를 이용해 Github 로그인 연동, Github Api 사용해보기 [내부링크]

Github api를 이용한 프로젝트가 예정되어있는데 Github api 사용이나 로그인 쪽이 자료가 적어서 직접 Baeldung 에 있는 문서를 보면서 학습해보았다. 의존성(Gradle) 먼저 시큐리티와 oauth-client이라는 의존성이 필요하다. 깃허브 api 를 제공하는 의존성도 추가해준다. application.yml spring.security.oauth2.client.registration 뒤에 저런식으로 github, google 등등의 여러가지 방식의 client-id 와 client-secret 을 입력하면 Oauth2ClientAutoConfiguration 클래스가 활성화돼서 자동으로 매핑시켜준다. registration 분류(여러가지 소셜 로그인 사용할 때) 만약 Github가 아니라 여러가지 소셜 로그인을 이용할 경우 yml 파일에서 설.......

Querydsl - 페치조인 테스트(성능 이슈) [내부링크]

Member 엔티티와 Ticket 엔티티는 1대1 양방향 관계다 (회원 1명당 번호표 한장밖에 뽑지 못한다) (매장의 대기순번 번호표를 뽑는 상황) 테스트를 위해 1명의 매장 관리자 회원과 10명의 일반 회원 데이터를 넣었다. 그리고 10명의 일반 회원들이 각각 한장의 번호표를 뽑은 상황을 가정해 데이터도 추가해줬다. MemberQueryRepository 그 후 admin 페이지의 전체 회원 리스트를 뽑는 쿼리를 작성했다. (페이징 처리) (static import 사용) AdminService 페이징된 회원리스트를 MemberListDto로 변환하는 작업이다 ticket_id에 member.getTicket().getId()를 넣어주는 과정에서 n+1 사태가 발생한다. (OneToOne 지연로딩으로 설정해주었기 때문.......

offset, limit 차이 정리 [내부링크]

페이징 처리를 안하다가 하면 가끔씩 헷갈릴 때가 있어서 정리를 한다. offset, limit의 차이는 간단하다. offset 은 몇번째 행부터 출력할지 limit 은 몇개의 사이즈로 출력할지(행의 수) ex) 1페이지 0번째부터 9번째까지의 데이터 10개 출력 offset 0 limit 10 ex) 2페이지 10번째부터 19번째까지의 데이터 10개 출력 offset 10 limit 10

[오류] specified key byte array is 72 bits which is not secure enough for any JWT HMAC-SHA algorithm [내부링크]

io.jsonwebtoken.security.WeakKeyException: The specified key byte array is 72 bits which is not secure enough for any JWT HMAC-SHA algorithm. jwt secretKey에 대한 오류가 떴다. secretKey는 짧게 적으면 안된다고 오류가 떠서 길게 수정해줬다.

[오류] net::ERR_ABORTED 400 [내부링크]

채팅방을 구현해보고있었다. ERR_ABORTED 400 이러한 오류가 떴는데 일단 시스템상에선 딱히 문제가 되지 않았다. 원인을 찾아봤는데 클라이언트에서 컨트롤러로 값을 전달할 때 Long값이 null 일때 저런 오류가 뜨는것 같다. 그래서 처음에 뜨는게 아닐까 싶다... 정 거슬리면 클라이언트에서 toString으로 변환해서 사용하고 컨트롤러에서 받아서 다시 Long으로 바꿔서 사용한다면 오류가 뜨지않는다!

Spring STOMP 웹소켓을 이용해 채팅서비스 구현해보기(채팅방 구분, 채팅 저장) [내부링크]

Spring의 STOMP를 이용해서 채팅방을 구현해보려 한다. STOMP (Simple Text Oriented Message Protocol)이란 WebSocket을 좀 더 효율적으로 다루기 위한 프로토콜로서 기존에 사용했던 WebSocket보다 많이 편리한 장점이 있다. 기존의 WebSocket은 일일히 Handler로 코드를 작성해야 했는데 STOMP를 사용하면 메세지를 전송하기전에 Subscriber와 Publisher(Sender)를 지정하여 편리하게 이용할수 있게 해준다. 이해하기 쉽게 설명하자면 채팅방을 분류하기 위해 room/1, room/2, room/3... 으로 나누었다고 하자 1. 클라이언트(Sender)가 메세지를 보내면 STOMP 통신으로 서버에 메세지가 전달된다. 2. Controller의 @MessageMapping에 의해 메.......

URI, URL, URN, HTTP 메세지 전송 흐름 [내부링크]

URI (Uniform Resource Identifier), URL (Uniform Resource Locator), URN (Uniform Resource Name) Uniform : 리소스 식별하는 통일된 방식 Resource : 자원, URI로 식별할 수 있는 모든 것(제한 없음) Identifier : 다른 항목과 구분하는데 필요한 정보 URL은 특정 서버의 한 리소스에 대한 구체적인 위치를 말하며 URN은 콘텐츠를 이루는 한 리소스에 대해, 그 리소스의 위치에 영향 받지 않는 유일무이한 이름을 말한다. URL 을 살펴보면 https://search.naver.com/search.naver?query=스프링 - 프로토콜 (https) - 호스트명 (www.naver.com) - 포트번호 (443, 생략가능) http는80 https는 443 - 패스 (/search.naver) - 쿼리 파라미터.......

HTTP 메세지, 무상태 프로토콜(Stateless), 비 연결성 [내부링크]

HTTP (Hyper Text Transfer Protocol) 인터넷에서 데이터를 주고받을 수 있는 프로토콜 이며 요즘은 HTTP 메세지에 사용하는 모든 것을 전송한다고 보면 된다. 현재는 HTTP/1.1 을 가장 많이 사용하며 HTTP/2, HTTP/3 도 점점 증가 하고 있는 추세다. HTTP/3 은 개발중이며 UDP 를 사용한다 (나머진 다 TCP 이용) 네이버 같은 경우 http/2 를 가장 많이 사용하며 http/1.1도 같이 사용한다는걸 볼 수 있다. (구글은 http/3도 사용한다) HTTP 메세지 이렇게 구조되어있다.(공백은 무조건 있어야됨) 요청 메세지인 경우엔 요청 데이터가 없으면 공백으로 냅두고 보내고 요청 데이터가 있다면 body에 작성해서 보낸다. (헤더엔 Host: 만 가능 Host 띄.......

부트페이와 SpringBoot를 이용한 결제 연동 - 서버 검증 [내부링크]

Gradle 의존성 추가 부트페이에 필요한 의존성 들과 json을 object로 변환하기 위해 ObjectMapper 의존성을 추가했다. 먼저 부트페이에서 제공하는 Git 코드에서 BootPayApi.class model/request 폴더 model/response 폴더 는 다 사용해야해서 복사해서 자신의 프로젝트에 붙여넣기 해준다. (import에서 오류가 뜰텐데 알아서 수정하자) 위 3가지는 부트페이에서 Java로 부트페이의 기능들을 코드로 짜놓은 것이다. 우리는 이용만 하면 된다. 부트페이의 결제 흐름 1. 사용자가 부트페이로 결제 요청을 한다.(DB서버에 결제정보 저장 - 결제중) 2. 부트페이는 PG사에 결제 요청을 한다. 3. PG사의 결제창을 사용자에게 보여준다 ( ex 이니시스 결.......

Spring - 조회한 빈이 모두 필요할 때, 자동 or 수동 빈 주입 기준 [내부링크]

이렇게 DiscountPolicy 라는 할인 정책 인터페이스는 고정 할인 정책인 FixDiscountPolicy 와 퍼센트 할인 정책인 RateDiscountPolicy 를 스프링 빈으로 주입받아 사용하고 있다. (@Primary 로 인한 충돌 방지로 RateDiscountPolicy 가 우선적으로 주입된다.) 하지만 경우에 따라 Fix, Rate 중 로직에 따라 원하는 빈을 주입받아야 할 경우가 생긴다면 DiscountService 는 Map 으로 모든 DiscountPolicy 를 주입받는다. (FixDiscountPolicy, RateDiscountPolicy) Map<String, DiscountPolicy> 의 키에 스프링 빈의 이름을 넣어주고 값에는 이름에 따른 스프링 빈 값을 넣어준다 (생성자로 주입 받는다. @Autowired) 그 후 discount 라는 메.......

Spring - Bean 생명 주기, Initializing Disposable Bean, init destroy Method, PostConstruct PreDestroy [내부링크]

외부 네트워크에 미리 연결하는 객체를 하나 생성한다고 가정하겠다. (실제로x, 그냥 문자 출력으로 테스트) 테스트 클래스에서 static class 를 만들어 @Configuration 을 해주고 NetworkClient 스프링 빈 객체를 만들어줬다. 하지만 테스트 해본 결과 networkClient.setUrl 로 값을 넣어줬는데 null 값이 들어온걸 볼 수 있다. 이유는 스프링 빈은 객체를 먼저 생성하기 때문에 객체를 생성할 때는 당연히 아무 값이 안들어 있는게 맞다. setter 주입을 통해서 값을 넣어야지 url 가 존재할 수 있게 된다. 간단하게 설명하자면 스프링 빈은 객체 생성 -> 의존관계 주입 이런 라이프사이클을 가진다. 즉 객체가 생성되고, 의존관계 주입이 다.......

[오류] Scope 'request' is not active for the current thread [내부링크]

scope request 활성화 오류 request scope를 HTTP 요청에 따라 로그를 찍는 MyLogger 클래스를 만들어 테스트 해보고 있었는데 No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. Scope 'request' is not active for the current thread; consi.......

Spring - 빈 스코프(프로토타입 스코프, 웹 스코프, Provider, 프록시) [내부링크]

스프링의 여러가지 스코프 [빈 스코프] 싱글톤 : 스프링 컨테이너의 시작 부터 종료까지 유지되는 가장 긴 스코프 (항상 같은 인스턴스 반환) 프로토타입 : 스프링 컨테이너가 빈의 생성과 의존관계 주입 후 더는 관리하지 않음 [웹 스코프] request : 웹 요청이 들어오고 나갈때 까지 유지되는 스코프 session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프 application : 웹 서블릿 컨텍스와 같은 범위로 유지되는 스코프 websocket : 웹 소켓과 동일한 생명주기를 가지는 스코프 프로토타입 스코프 프로토타입 스코프로 빈을 지정하고 클라이언트가 요청시 스프링 컨테이너는 프로토타입 빈을 생성하고 의존관계 주입 까지 끝낸 후 클.......

IP, TCP, UDP, PORT, DNS [내부링크]

IP (인터넷 프로토콜 Internet Protocol) - 지정한 IP 주소에 데이터를 전달한다. - 패킷 이라는 통신 단위로 데이터를 전달한다. 클라이언트와 서버가 있다면 둘다 다른 IP를 가지고 있으며 클라이언트가 서버에 데이터를 보내게 되면 나의 IP, 보낼 IP, 데이터 를 가지고 패킷을 만들어 보내게 된다. (노드들을 통해 전달됨) IP (인터넷 프로토콜)의 한계 - 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷이 전송된다.(받는 사람이 데이터를 못받음) - 중간에 노드 서버가 문제가 생겨서 패킷이 유실되도 어쩔수 없다. - 패킷의 용량이 클때 패킷 전달 순서에 문제가 생길 수도 있다. TCP (전송 제어 프로토콜 Transmission Control Pro.......

Querydsl - join에 on 절 사용하기 [내부링크]

조인을 하려하는데 조회하려는 엔티티에 연관관계가 없거나 다른 엔티티에 외래키가 있는경우에는 직접 지정해줄 수 있다. ex) 회원, 티켓 은 1대1 연관관계를 가지며 티켓에 회원_id가 포함되는 단방향으로 설계를 했다 회원리스트를 뽑는데 티켓의 정보도 함께 보여지고 싶다(없는 경우 null) team.member는 사용할 수 있지만 member.team 은 사용할 수 없다(단방향으로 설계) 이럴때는 join에 on절을 명시해주면 된다.

부트페이와 SpringBoot를 이용한 결제연동 - 단순 결제 [내부링크]

먼저 부트페이 회원가입을 해야한다. 회원가입을 완료했다면 오른쪽 상단에서 프로젝트 선택을 누르고 프로젝트를 생성한 후 원하는 PG사와 결제 수 클릭후 테스트 모드로 설정한다. 이후 상단의 메뉴에서 인증키 및 보안을 눌른다 본인은 이니시스 웹 결제 연동을 테스트 해볼것이므로 WEB을 클릭해 WEB Application ID 를 복사한다. 그리고 이제 결제하기를 눌렀을 때 실행되는 html 파일을 만든다. 밑 코드는 부트페이가 제공하는 CDN이라서 html에 추가해줘야한다. 아까 복사한 WEB Application ID 는 밑 코드에서 application_id 라고 적혀있는 부분에 넣어준다. (밑 코드는 javascript 코드이고 결제버튼을 눌렀을 때 연결되는 html 파일에.......

Spring - 싱글톤(싱글톤 패턴, 싱글톤 문제점, 스프링 컨테이너) [내부링크]

어플리케이션은 보통 여러 고객들이 동시에 요청을 한다.하지만 요청이 있을때 마다 객체를 생성한다면이렇게 참조값이 다른 것을 볼 수 있다.-> 고객들이 요청할 때 마다 객체가 계속 생성되니까 엄청난 메모리 낭비이다.객체를 1개만 생성하고 이 객체를 공유하도록 설계를 한다면 해결된다.이 해결책을 싱글톤 패턴 이라고 부른다.싱글톤 패턴클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인 패턴이다.static 영역에 객체 instance를 미리 하나 생성해서 올려둔다.이 객체 인스턴스가 필요하면 getInstance() 메서드를 통해서만 조회할 수 있다.-> 호출시 항상 같은 인스턴스를 반환1개의 객체 인스턴.......

Spring - 싱글톤 방식의 주의점(멀티 스레드 문제) [내부링크]

싱글톤 패턴, 싱글톤 컨테이너(스프링)을 사용하는 방식은여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에싱글톤 객체를 유지(stateful)하게 설계하면 안된다.무상태로(stateless)하게 설계해야 한다.- 특정 클라이언트에 의존적인 필드가 있으면 안된다.- 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다.- 가급적 읽기만 가능해야 한다(수정 x).- 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.Stateful 할 때 테스트StatefulService는 공유되는 인스턴스이다.거기안의 필드값 price 도 공유되는 필드이다.A사용자가 10000원을 주문했고 주문 금액을 조.......

Spring - 컴포넌트 스캔, 필터, 중복 등록(충돌) [내부링크]

컴포넌트 스캔 (@ComponentScan)맨날 @Bean으로 등록하다보면 누락하는 문제와 반복성에 힘이든다.그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 기능을 제공한다.@Configuration 도 컴포넌트 스캔에 대상이다.(내부에 @Component 존재)디폴트 값은 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작위치 이다.따라서패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두면 된다.@ComponentScan 은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록한다.(스프링 빈의 기본 이름은 클래스명을 사용하지만 맨 앞글자만 소문자로 변경해서 사용된다.)'@ComponentS.......

Spring - 다양한 의존관계 주입(생성자, setter, 필드, 일반 메서드), 옵션 처리 [내부링크]

생성자 주입- 생성자 호출 시점에 딱 한번만 호출되는게 보장된다.- 불변, 필수 의존관계에 사용된다.(생성자가 1개만 있는 경우에는 @Autowired 를 생략해도 스프링 빈에 한에서 주입된다.)- final 키워드를 사용할 수 있다.(생성자에 값 세팅이 필수로 되게)밑의 나머지 주입 방식들은 모두 생성자 생성 이후에 호출되므로 final 이 사용 불가능하다.롬복을 사용하면 @RequiredArgsConstructor 를 사용해서 바로 생성자 주입을 할 수 있다.(필수 값인 final 이 붙은 값들을 인자로 하여 생성자를 만들어준다)수정자(setter) 주입- 선택, 변경 가능성이 있는 의존관계에 사용한다.(MemberRepository가 스프링 빈에 등록 안될 수도 있.......

Spring - 조회 빈이 여러개 일때 (@Autowired 필드명 매칭, @Qualifier, @Primary, 커스텀 어노테이션) [내부링크]

의존 관계 주입(DI)을 할 때 조회 빈이 2개 이상이라면(MemberRepository 에 주입 받을 빈이MemoryMemberRepository, DbMemberRepository 이렇게 2개가 있을 때)스프링 빈은 타입으로 조회하기 때문에(ac.getBean(MemberService.class))NoUniqueBeanDefinitionException 이 발생한다.해결방법은 3가지가 있다.- @Autowired 필드 명 매칭- @Qualifier -> @Qualifier 끼리 매칭 -> 빈 이름 매칭- @Primary 사용@Autowired 필드 명 매칭타입 매칭 결과가 2개 이상일 때 필드 명, 파라미터 명으로 빈 이름을 매칭해준다.@Qualifier 사용빈 등록시 @Qualifier 로 조회할 이름을 붙여준다.@Primary 사용우선.......

[오류] Lombok @Builder 생성자 관련 오류 [내부링크]

롬복의 @Builder 사용시 생성자 관련 오류를 은근히 자주 접한다.그래서 이참에 오류를 정리해서다음에는 깔끔하게 사용하려 한다.원인은 @Builder 사용시 @NoArgsConstructer 를 같이 사용해서이다.( 객체를 아무렇게나 new 로 생성 못하게 막으려고 @NoArgsConstructer(access= AccessLevel.PROTECTED) 를 자주사용하기 때문)@Builder 를 사용하면 모든 요소가 포함된 생성자가 생성되는데- 생성자가 없는 경우 :모든 멤버변수를 파라미터로 받는 기본 생성자 생성- 생성자가 있을 경우 : 따로 생성자 생성 Xreturn new Member(this.id, this.username, this.password); 이거와 일치하는 생성자가 없어서 오류가 발생한다(이.......

[오류] com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException [내부링크]

ObjectMapper 로 Json -> Object 로 변환할 때json 필드와 object 필드가 매칭이 안돼서 오류가 생긴거였다.이렇게 위에@JsonIgnoreProperties(ignoreUnknown = true) 을 붙이면 매칭이 안되면 null 을 붙여준다(기본값은 false 로 되어있다)

프레임 워크, 라이브러리 차이 [내부링크]

프레임워크란?흔히 뼈대라고 하는데 소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합이다.라이브러리란?특정 기능의 대한 도구나 함수라고 하는데단순 활용이 가능한 도구들의 집합이다.하지만 명백한 차이는 IoC 제어의 역전에서 나온다고 보면 된다.프레임워크는 내가 작성한 코드를 제어하고, 대신 실행해준다라이브러리는 내가 작성한 코드를 직접 제어의 흐름을 담당해야한다.

IoC, DI 란? IoC, DI 컨테이너 란? [내부링크]

설명 정리 전에 밑의 3개의 포스팅을 보고 오는걸 추천한다.(예제 코드작성)(OCP, DIP를 위반한 인터페이스의 구현클래스 변경)(OCP, DIP를 만족하는 인터페이스의 구현클래스 변경)제어의 역전 IoC (Inversion of Control)기존의 프로그램들은 구현 클래스가 스스로 필요한 객체를 생성하고 실행했다.(구현 객체가 프로그램의 제어 흐름을 스스로 조종했다.)하지만 AppConfig 등장 후 프로그램의 제어 흐름에 대한 권한은 모두 AppConfig가 가지고 있다.ex) MemberServiceImpl, OrderServiceImpl 는 어떤 객체를 주입 받는지 모른채 자신의 로직만 실행이렇게 프로그램의 제어 흐름을 직접 제어하는게 아니라외부에서 관리하는 것.......

Spring 적용 후 - 예제를 스프링으로 전환, @Configuration, @Bean, 스프링 컨테이너, 스프링 빈 [내부링크]

전에 Java로만 만든 예제를 Spring으로 전환해 볼 것이다.@Configuration스프링 컨테이너가 해당 클래스를 스프링의 설정 정보로 사용한다.@Bean이 어노테이션이 붙은 메서드를 호출해서 반환된 객체를스프링 컨테이너에 빈으로 등록AppConfig 에 @Configuration, @Bean 추가MemberApp 클래스를 만들어 테스트이렇게 스프링 컨테이너에 빈이 생성되는걸 볼 수 있다.ApplicationContext 를 스프링 컨테이너라고 한다.(ApplicationContext 는 인터페이스)(스프링 컨테이너는 XML, 자바 클래스 두 방법으로 만들 수 있다.)(new AnnotaionConfigApplicationContext() 는 ApplicationContext 의 구현체)스프링 컨테이너는.......

Spring - 스프링 빈 조회(모든 빈, 동일한 타입, 상속 관계) [내부링크]

스프링을 사용하기에 사용할 일 없지만 기본적으로 빈을 조회하는 방법쯤은 알고 있어야한다.컨테이너에 등록 된 모든 빈 조회 해보기ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회ac.getBean() : 빈 이름으로 객체를 조회(스프링이 내부에서 사용하는 빈까지 출력 됨)스프링이 내부에서 사용한은 빈은 getRole() 로 구분할 수 있다- ROLE_APPLICATION : 사용자가 정의한 빈- ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈기본 빈 조회 테스트스프링 빈 조회 - 동일한 타입이 둘 이상타입으로 조회시 같은 타입이 둘 이상 있으면 NoUniqueBeanDefinitionException 오류 발생같은 타입이 둘 이.......

Spring - BeanFactory, ApplicationContext 차이 [내부링크]

BeanFactory- 스프링 컨테이너의 최상위 인터페이스- 스프링 빈을 관리하고 조회하는 역할- getBean() 을 사용- 지금까지 예제 코드로 살펴본 대부분의 기능은 BeanFactory가 제공ApplicationContext- BeanFactory 의 기능을 모두 상속받아서 제공BeanFactory, ApplicationContext 의 차이ApplicationContext는 BeanFactory 뿐만 아니라 여러가지 인터페이스를 가지고 있다.- 메세지 소스한국에서 들어오면 한국어, 미국에서 들어오면 영어로 출력- 환경변수로컬, 개발, 운영등을 구분해서 처리- 어플리케이션 이벤트이벤트를 발행하고 구독하는 모델을 편리하게 지원- 편리한 리소스 조회파일, 클래스패스, 외부 url 같은 곳.......

Spring - XML를 이용한 빈 설정 예제 [내부링크]

아직 많은 레거시 프로젝트들이 XML로 되어있고또한 XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장점도 있어서한번쯤 알고는 있는게 좋다.XML 설정빈 테스트이렇게 스프링은 유연한 설정을 제공한다는 것을 볼 수 있다.References. 김영한 강사님

Spring - 스프링 빈 설정 메타 정보(BeanDefinition) [내부링크]

스프링은 XML, JAVA Configuration을 지원한다.어떻게 이렇게 유연하게 제공하는 걸까?여기에는 BeanDefinition 이라는 추상화가 있다.- XML을 읽어서 BeanDefinition을 만들면 된다- 자바 코드를 읽어서 BeanDefinition을 만들면 된다자바 코드 config로 예를 들자면AnnotationConfigApplicationContext는AnnotatedBeanDefinitionReader를 사용해서 AppConfig.class의 설정 정보를 읽고 BeanDefinition을 생성한다.그래서 ApplicationContext는AnnotationConfigApplicationContext에 있는 BeanDefinition의 정보를 얻어서 사용한다.이와같이 새로운 형식의 설정 정보가 추가되면, xxxBeanDefinitionReader를 만들어서BeanDefinition.......

Querydsl - 스프링 데이터 JPA + 페이징, Controller 조회 [내부링크]

1. select, totalcount 쿼리 한번에 날리기2. select, totalcount 쿼리 나눠서 날리기select 쿼리가 복잡한데 비에 total count 쿼리는 간단하게 만들 수 있을 때 사용 (total count 최적화)Controller 만들어 간단하게 조회 테스트테스트에선 파라미터로 page, size둘다 넘겼지만 밑 처럼 실제론 Controller에서 처음부터 사이즈를 지정하면 된다.(이러면 0번째 페이지부터 나온다 -> 그 이후는 파라미터로 페이지 값 넘기기)Api Test김영한 강사님의 강의를 보면서 공부중입니다

스프링, 객체 지향 프로그래밍, SOLID [내부링크]

스프링은 자바 언어 기반의 프레임워크이다.자바 언어는 객체 지향 언어다.스프링은 객체 지향 이라는 엄청난 장점을 살려 개발할 수 있게 도와주는 프레임워크다.객체지향의 특징- 추상화- 캡슐화- 상속- 다형성(객체 지향의 핵심)객체 지향 프로그래밍에선레고 블럭 조립하듯이, 컴퓨터 부품 갈아 끼우듯이 유연하게 변경하면서 개발할 수 있게 도와준다.스프링은 다형성을 극대화해서 이용할 수 있게 도와준다.스프링의 IoC, DI은 다형성을 활용한다.따라서 스프링을 이용하면 레고 블럭 조립처럼 편하게 개발할 수 있다.SOLID (좋은 객체 지향 설계의 5가지 원칙)- SRP : 단일 책임 원칙하나의 클래스는 하나의 책임만 가져야.......

Spring 적용 전 - 예제로 사용할 코드 작성(간단한 회원, 주문, 할인 도메인설계) [내부링크]

스프링 없이 순수한 자바만으로 간단한 개발을 하고(예외 처리x)나중에 스프링을 적용하여스프링에 대한 기초를 탄탄히 다지려고 한다.먼저 스프링을 적용하지 않는 순수한 자바 코드로예제에 사용할 도메인들을 설계한다[회원 도메인]- 회원 가입, 조회- 회원은 일반, VIP 두 가지 등급이 있다- 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템하고도 연동할 수 있다 (미확정)[형태]클라이언트 -> 회원 서비스(회원가입, 회원조회) -> 회원 저장소(메모리 저장소, DB저장소, 외부 시스템DB)Member(회원 도메인)MemberRepository (Interface)(회원 저장소 인터페이스)MemoryMemberRepository (구현 class)(메모리.......

Spring 적용 전 - 인터페이스의 구현 클래스 변경 [내부링크]

서비스 오픈직전이라고 가정해보자원래는 고정적으로 1000원을 할인해주는 할인 정책이였는데기획자가 서비스 오픈직전에 10퍼센트 할인 정책으로 바꿔야겠다고 한다.객체 지향적으로 설계를 하지 않았다면 일일히 수정해줘야했는데객체 지향적으로 설계를 했으므로 구현 클래스만 하나 만들어서 조립해주면 된다.RateDiscountPolicy (구현 class)( 10퍼센트 할인하는 구현 클래스 )할인 테스트이렇게 클래스를 구현하고 테스트를 마친후(간단하게 작성)OrderServiceImpl 라는 구현 클래스에서 FixDiscountPolicy를 RateDiscountPolicy로 바꿔주면 된다.하지만!!!!!!!인터페이스와 구현클래스를 잘 분리하여 사용하였고다형성도 잘 활.......

Spring 적용 전 - OCP, DIP를 지켜 인터페이스의 구현 클래스 변경 [내부링크]

MemberServiceImpl 라는 MemberService 구현 클래스는MemberRepository라는 인터페이스를 생성자를 통해 주입받는다.-> MemberServiceImpl는 MemberRepository에 뭐가 올지 모른다.따라서 MemberServiceImpl는 코드를 수정할 일이 없고 외부(AppConfig)에서 컨트롤 해준다.(MemberServiceImpl가 전에 구현클래스들을 의존했던게 사라짐)OrderServiceImpl도 같은 원리AppConfig 클래스는 생성한 객체 인스턴스의 레퍼런스를 생성자를 통해서 주입해준다.(객체의 생성과 연결은 AppConfig가 담당)구현 클래스 변경이 필요할 때 AppConfig만 변경 해주면 된다.(인터페이스, 구현 클래스는 아무것도 안건들여도 됨)-> 이러면 DIP, OCP를.......

IntelliJ Mac용 단축키 [내부링크]

맥북 프로를 샀습니다!!그래서 찾아보고 익숙해지려고 자주쓰는 단축키를 메모해놓습니다.현재 포커스 : Control + Shift + R이전 실행 : Control + R라인 복사하기 : Command + D라인 삭제하기 : Command + back space라인 합치기 : Control + Shift + J구문 단위 이동 : Shift + Command + 위 또는 아래라인 단위 이동 : Shift + Option + 위 또는 아래인자값 보기 : Command + P해당 내용 문서 보기 : F1단어 단위로 이동 : Option + 좌 또는 우라인 처음과 끝으로 이동 : Fn + 좌 또는 우라인 전체 선택 : Shift + Command + 좌 또는 우페이지 업, 다운 : Fn + 위 아래포커스 범위 잡기 : Option + 위 아래포커스 이전 / 다음으로 이동 :.......

Querydsl - 벌크 연산, 삭제, SQL function [내부링크]

벌크연산삭제원래 JPA는 변경감지(더티체킹)으로 update가 된다.벌크연산 update를 하게되면 영속성 컨텍스트를 무시하고DB에 쿼리를 날리게된다.그러므로 영속성 컨텍스트랑 DB 테이블 값이랑 다르게되서같은 트렌젝션 안에서 select를 하면 영속성 컨텍스트에 있는 값이 나오게 된다.해결책 : em.flush(), em.clear()를 통해 영속성 컨텍스트를 초기화 시켜주면 된다.[자세한 내용]SQL Function(JPA와 같이 Dialect에 등록된 내용만 사용 가능)lower는 내장형 함수라 지원이 가능하다.(지원 가능 함수라서 이렇게 처리해도 결과가 똑같다)(둘 다 같음)김영한 강사님의 강의를 보면서 공부중입니다

[오류] JPA test시 InvalidDataAccessApiUsageException [내부링크]

org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' callJPA를 Test해보는 도중 이러한 오류가 떴다.오류를 보니 트렌젝션이 필요하다고 한다스프링부트테스트에 트렌젝션을 빼먹었었다이렇게 진행하면 해결된다.

Querydsl - 동적 검색 쿼리 연습(4가지 조건으로 동적 검색) [내부링크]

회원 이름, 팀 이름, 회원 나이 몇살이상, 몇살 이하이렇게 4가지 조건으로 검색하는 동적 쿼리 연습요청 dto응답 dtotest 데이터 추가1. BooleanBuilder 사용2. BooleanExpression 메서드 이용test 코드만약에 4가지 조건중 4가지가 다 빠졌을 경우querydsl은 모든 데이터를 다 가져온다.만약에 데이터가 많을 경우 모든 데이터를 가져오므로 성능 문제가 생길 수 있다.그래서 이런건 페이징 쿼리랑 같이 들어가야한다.김영한 강사님의 강의를 보면서 공부중입니다

Querydsl - SpringDataJPA랑 연동, 간단한 동적 search api 조회 [내부링크]

스프링데이터 JPA와 Querydsl를 함께 쓰려면Repository를 커스텀해서 사용해야 한다.(JpaQueryFactory는 미리 빈으로 만들어둠)1. 먼저 커스텀 리포지토리를 Interface로 만든다.(search는 내가 구현할 동적 쿼리 검색 기능)2. 커스텀 리포지토리 구현체 클래스를 만들고 구현을 한다.(이름은 꼭 해당 레포지토리명 + Impl 으로 만들어야한다)3. 레포지토리 커스텀 인터페이스를 원래의 레포지토리가 상속받아서 사용한다스프링데이터JPA는JpaRepository를 상속받아 사용하는데 다중 상속이 되므로 커스텀 레포지토리를 만들어 상속받아 사용하면 된다.( MemberRepository -> MemberRepositoryCustom -> MemberRepositor.......

Querydsl - 프로젝션, DTO조회(최종 해결방안까지) [내부링크]

프로젝션 대상이 하나 -> String, int 등 타입 지정프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회해야한다.[튜플]튜플은 서비스 계층이나 컨트롤러까지 넘어가서 쓰는건 좋은 설계가 아니다.사용할거면 repository안에서만 쓰고 DTO로 변환해서 서비스나 컨트롤러에서 사용해야한다.JPQL로 Dto를 조회하면 굉장히 귀찮다이런식으로 해야돼서 좋지않다따라서 Querydsl은 매우 유용하다는것을 느꼈다.[DTO로 조회](밑의 코드처럼 Projections. 안에 Dto.class, dto의 필드명을 적어줘야한다)1. setter를 이용하면 Projections.bean()을 이용2. field 주입을 이용하면 Projections.fields()를 이용하지만 이.......

Querydsl - 동적쿼리(BooleanBuilder, BooleanExpression) [내부링크]

username, age의 값이 있거나 null 일 때 동적 쿼리1. BooleanBuilder 사용2. BooleanExpression 이용(where 조건에 null 값은 무시됨)메서드를 이용하면 메서드가 늘어나는 단점이 있지만코드를 볼때 밑에 메서드 까지 보지는 않고usernameEq, ageEq 명을 통해 한눈에 어떤 기능인지 확인 가능하다.(가독성 증가)또한 이런식으로 메서드로 조합해서 사용할 수 있다.(재사용성 증가)(null 체크는 주의해서 해야됨)김영한 강사님의 강의를 보면서 공부중입니다

Querydsl - 서브 쿼리 [내부링크]

서브쿼리는 JPAExpressions를 사용한다(스태틱 임포트 사용 가능 -> JPAExpressions 감추기 가능)JPA 서브쿼리는 from절에서 지원하지 않는다.[해결방안]1. 서브쿼리를 join으로 변경 (가능, 불가능한 상황이 있음)2. 쿼리를 2번 분리해서 실행3. nativeSQL을 사용김영한 강사님의 강의를 보면서 공부중입니다

Querydsl - Case문, 상수 문자 더하기 [내부링크]

stringValue() 는 Enum 처리할때 자주사용한다김영한 강사님의 강의를 보면서 공부중입니다

Querydsl - 검색 조건 쿼리(where), 결과 조회(fetch) [내부링크]

다양한 검색 조건 예시- fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환 - fetchOne() : 단 건 조회 결과가 없으면 : null 결과가 둘 이상이면 : com.querydsl.core.NonUniqueResultException 발생 - fetchFirst() : limit(1).fetchOne() - fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행 - fetchCount() : count 쿼리로 변경해서 count 수 조회fetchResults 같은 경우 content를 가져오는 쿼리랑실제 totalCount를 가져오는 쿼리가 다른 경우가 있는데이 때는 쿼리를 두 번 따로 날려야한다김영한 강사님의 강의를 보면서 공부중입니다

Querydsl - 내부 조인, 외부 조인, 세타 조인, 페치 조인 [내부링크]

inner 조인이너 조인 사용시 on절이랑 where절이랑 같다(내부 조인 사용시 where절로 해결)left join(외부 조인인 경우 on절로 해결)세타 조인세타조인을 제외하고내부조인이나 외부조인에서는join절에 연관관계가 있는 엔티티가 들어가야됨ex) (left) join(member.team, team) -> (연관관계 안의 값, QTeam.team)페치 조인뒤에 .fetchJoin() 을 붙여주면 알아서 한방에 끌어온다김영한 강사님의 강의를 보면서 공부중입니다

클린 코드 - 의미 있는 이름 [내부링크]

코드를 더 효율적이고 좋게 짜고 싶어서 Clean Code라는 책을 구매해서 읽으면서 공부하면서 정리를 해보았다.1. 의도를 분명히 밝혀라d는 아무런 의미가 드러나지 않지만 밑에 변수명들은 의도가 들어난다.(이름만 고쳐도 함수가 어떤 동작을 하는지 이해하기 쉬워진다)2. 그릇된 정보를 피하라이렇게 코드를 작성한다면 O과 0, 1과 l을 구분하기가 힘들어진다.또한 여러 계정을 그룹으로 묶을 때, 실제 List가 아니라면 accountList라고 명명하지 않는다.3. 검색하기 쉬운 이름을 사용하라위 처럼 코드를 짜면 검색도 불가능할 뿐만 아니라 10000, 5가 무슨 의미인지 알기가 쉽지않다.이름만 잘 지어주면 함수가 길어지지만.......

Querydsl 세팅(Gradle) [내부링크]

Gradle 세팅정상적으로 라이브러리가 추가되었다Test를 해보기위해간단한 Entity를 만들고Gradle -> Tasks -> other -> compileQuerydsl를 눌러보면(자동으로 빌드해도 생김)이렇게 지정한 폴더에 QTest가 생기고 src/main으로 잡힌걸 확인할 수 있다(이걸 그대로 코드에서 사용할 수 있다)QTest같은건 Git에서 관리하면 안된다(build 안에다가 넣으면 Git ignore가 자동으로 처리되서 상관없지만build가 아닌폴더로 지정한 경우에는 git ignore를 해주어야한다)간단한 querydsl Test김영한 강사님의 강의를 보면서 공부중입니다

JPQL vs Querydsl 비교 [내부링크]

JPQL 회원 이름으로 select하는 간단한 테스트 코드Querydsl 회원 이름으로 select하는 간단한 테스트 코드JPQL은 sql문 작성시 오류가 있을시 이 메서드가 실행될때 오류가 발생한다.반면에Querydsl은 프로젝트를 컴파일시에 바로 오류가 발생한다.JPQL은 서버가 돌아가는데 클라이언트에서 어떤 요청을 했을시에 오류가 발생하므로 좋지 않다.Querydsl은 컴파일시에 바로 오류가 발생하여 즉각 대처가 가능하다.(또한 Querydsl은 파라미터바인딩이 필요없다)김영한 강사님의 강의를 보면서 공부중입니다

Querydsl - Q-Type 활용 [내부링크]

가능하면 이렇게 스태틱 임포트를 사용하는게 깔끔하다김영한 강사님의 강의를 보며 공부중입니다

코드업[재귀함수] 우박 수(3n + 1) basic, reverse [내부링크]

3n + 1 우박수를 재귀를 통해 구하고 이를 순서대로 출력해주는 문제다Reverse는 출력을 반대로 해주는 문제라List를 만들고 거기에 우박수를 저장하고 재귀를 통해 반대로 출력해주었다

Oracle DB gradle, properties설설정 [내부링크]

사용자에 맞는 url, username, password 입력

[오류] unsatisfiedDependencyException, JPA 사용 중 빈 생성 오류 [내부링크]

iamport 결제서비스 연동 연습을 하려고 스프링부트 세팅을 하는데빈생성 오류가 떴다이런오류는 보통 @Controller @Service @Repository같은 어노테이션에서 발생하는데그래서 찾아보았더니바보같이 JPA를 이렇게 적었었다..새벽이라서 졸렸나보다.. 다시 이렇게 바꿔줘서 해결했다.

2021 SW 중심대학 공동 해커톤 후기 [내부링크]

학교 대표로 2박3일동안 SW 중심대학 공동 해커톤에 나가게 되었습니다(2/4 ~ 2/6 온라인 진행)대회에 대해 설명하자면 이렇게 많은 대학교 학생들이 대략 200명정도 나와서5명씩 팀을 꾸려서(같은 학교x) 2박3일동안 서비스를 하나 만드는 대회입니다저는 SpringBoot로 서버 개발을 하다보니까 2박3일동안 단기간에 개발 해야하는 서비스에 그리 좋진 않은것 같았습니다.거의 다 Django 나 Express를 사용하더군요...아무튼 팀에 들어갔습니다. 저희는 앱 서비스를 만드는 팀이였어요!WebRTC를 이용한 서비스인데 많이 언급은 안하겠습니다!저희 팀은 스택이 다들 애매했습니다..원래는 Spring Boot로 서버를 만들어서 Rest API형태로.......

코드업[재귀함수] 피보나치 수열(Large) DP이용 [내부링크]

피보나치를 그냥 이용할 경우 엄청난 재귀호출이 일어나므로배열에 저장해서 이미 값을 아는 경우 그대로 사용할수 있게 해줬다10009로 나눈 나머지 구한것은 수가 너무커서 문제에서 나누라고 했다

코드업[재귀함수] 2진수 구하기 [내부링크]

재귀함수로 2진수를 List에 저장시키고저장시킨 List을 StringBuffer를 이용해 합쳐서 출력해줬다

[오류] JPA Mysql 사용시 could not excute [내부링크]

AWS에 배포 성공후 db 커넥션시에 저런 오류가 떴다MYSQL 테이블명 인코딩 때문에 나는 오류다해결방법은 전역 설정, 테이블 인코딩 하나하나 설정이 있는데나는 테이블을 하나하나 설정하는 방법으로 했다rds 설정에서 다 utf-8로 바꿨는데 이상해서 그냥 하나하나 설정해줬다

Spring Boot + JPA 연습(회원 Entity, Service, Repository, Exception, Test, Test 환경설정) [내부링크]

구현 기능 회원 등록 회원 목록 조회테스트 요구사항 회원가입을 성공해야 한다 회원가입 할 때 같은 이...

Spring Boot + JPA 연습(상품 Entity, Service, Repository, Exception, Test) [내부링크]

구현 기능 상품 등록 상품 목록 조회 상품 수정재고 수정 비지니스 로직재고 0 일때 예외처리테스트 코드...

Spring Boot + JPA 연습(주문 Entity, Service, Repository, Test) [내부링크]

구현 기능 상품 주문 주문 내역 조회 주문 취소테스트 요구사항 상품 주문이 성공해야 한다 상품을 주문...

AWS EC2 Docker 이용해서 SpringBoot 배포하기 [내부링크]

AWS EC2 인스턴스 생성, RDS 생성, 우분투에 docker 깔고 설정하고 이미지 풀받고 드디어 배포다...!!!근데 docker를 통해 배포했는데 jvm 메모리 오류가 떴다 이것 저것해봐서 결국-m=2g를 입력해 해결하긴했다..!뭔가 스왑이 안된다고는 하는데 이거는 좀 더 찾아보긴 해야겠다..!암튼 docker를 컨테이너에 실행시키고웹사이트를 테스트 해봤는데!!!성공했다!!!너무 좋은것 같다 aws, docker....이제 프론트랑 작업할때 바로 서버를 만들어서 rest api 뿌려줄수 있다!!!담에는 url주소를 바꿔야겠다!

Docker 설치 (windows) [내부링크]

우선 도커 홈페이지에 들어가서

Docker 명령어 정리 [내부링크]

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]->도커의 컨테이너 실행 명령어이다 (run)ex) docker run -d -p 8000:8080 --name test ~~~~<기본 명령어>-d detached mode (백그라운드로 도커가 실행된다) -p 호스트와 컨테이너의 포트를 연결 (ex 컨테이너가 8080이라면 호스트는 8080일 필요없이 1234여도 연결해준다)-v 호스트와 컨테이너의 디렉토리를 연결 -e 컨테이너 내에서 사용할 환경변수 설정 --name 컨테이너 이름 설정 --rm 프로세스 종료시 컨테이너 자동 제거 -it -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 --network 네트워크 연결<PS 명령어> docker ps 실행중인 컨터이너.......

Spring Boot 간편하게 image 만들기 [내부링크]

만든 어플리케이션을 bootBuildImage로 빌드한다(Spring Boot 2.3버전에서 생겼다)이렇게 oauth2 0.0.3-ORACLE image가 생겼다

Docker로 Oracle 이용해보기 [내부링크]

먼저 docker를 이용해 Oracle 11g를 다운받는다11g도 종류가 많은데 그중에 jaspeen을 다운받았다다운이 다 받아졌으므로 docker에서 oracle11g라고 컨테이너 이름을 만들고1521포트가 아닌 1522포트로 백그라운드 형태로 컨터이너에 담아 실행시킨다그리고 docker ps를 입력해 실행중인 컨테이너 목록을 보았다잘실행되고있다그 후 sql developer을 실행시켜 테스트를 진행한다포트는 설정한 1522 포트를 사용하고system의 비밀번호는 oracle로 되어있다성공하면 이제 계정을 만들어주고 인텔리제이에서 test해보았다JPA 테스트 테이블 또한 만들어졌고정상 작동한다Oracle을 팀원들의 PC에서 실행시키고 환경설정.......

[오류] build jar 하여 외부에서 실행 했을때 Thymelaf 오류 [내부링크]

build하여 jar파일로 외부에서 실행해봤을때 Thymeleaf로 만든 html이 나오지 않았다인텔리제이에서 실행시켰을때는 잘됐는데 templates 오류가 떴다컨트롤러에서 경로가 잘못되어 그런건가하고 컨트롤러를 봤더니return "/main"이라고 되어있었는데이부분에서 원래는 /을 붙여주면 안되는데 그부분에서 경로문제가 생겼었다resource/templates 에서는 경로앞에 /를 붙여줘야지 서버에서 잘 읽었는데컨트롤러에선 아니였다

Docker hub에 이미지 올리기 [내부링크]

1. 로그인을 합니다2. tag를 이용해이미지 태그를 만듭니다docker tag [이미지ID or 이름+tag] [아이디/지정할 이미지 이름]:[버전]3. docker hub에 push합니다docker push [tag이름(버전까지)]docker hub에 들어가보면 정상적으로 push된 걸 볼 수 있습니다

AWS EC2 Ubuntu putty를 이용해 접속하기 [내부링크]

Putty Gen을 이용해 private Key를 발급받아야 하는데PuttyGen을 실행 시킨후 Load를 클릭한다2. AWS EC2 인스턴스를 생성하면서 저장했던 pem키를 클릭해준다그 후 Save private Key를 눌러 원하는 위치에 저장 시켜준다Putty를 실행시키고Host Name에는 AWS EC2 ip주소나 퍼블릭 IPv4 DNS를 입력하고Connection - SSH - Auth로 들어가서Browse를 누르고 아까 저장했던 privateKey를 눌러주고Open을 눌러준다(키가 안보인다면 All files 보기 전환)로그인 하라는 창이나오는데 ubuntu를 입력해준다그럼 이렇게 접속가능하다

AWS RDS mysql 이용하기 [내부링크]

AWS 콘솔로 들어가서 RDS 생성해주면 이런 창이뜨는데원하는 DB를 선택한후 버전까지 선택해줍니다(버전이 안뜨면 좀 기다리면 떴음)본인은 프리티어이므로 프리티어를 선택한 후DB 인스턴스 식별자는 그냥 프로젝트 이름정도마스터 사용자이름, 암호는 자기가 알맞게 설정해줍니다(DB접속 아이디 비번입니다)그리고 외부에서 접근할수 있게 퍼블릭 엑세스 가능을 예로 선택해주고 생성을 눌러줍니다5분정도 기다리면 생성중에서 생성 완료로 바뀌는데왼쪽 메뉴바에서 파리미터 그룹을 눌러줍니다(MYSQL이라서 utf-8 한글 인코딩 설정을 해줘야합니다)파라미터 그룹 생성을 눌러줍니다char를.......

AWS EC2 Ubuntu에 Docker 설치하기 [내부링크]

인스턴스를 생성한 후므로sudo apt-get update를 입력해 필요한 것을 업데이트 해줍니다docker가 겹치지 않게 혹시나 있던 docker를 삭제해줍니다이렇게 두줄로 docker를 설치해줍니다(제일 간단한 방법)sudo권한으로 설치된 버전을 확인해봐서 있으면 성공입니다(sudo su를 입력하면 자동으로 /home/ubuntu#가 뜸)

Api 예외 처리 [내부링크]

예외를 잡아서 처리하는 ErrorController를 하나 만들어줬다@ControllerAdvice를 추가한다음에이런식으로 만들어둔 Exception이나 그냥 Exception을 받아서 예외를 처리할수 있다

Swagger 사용 설정 [내부링크]

Gradle 세팅혹시나 Hateoas랑 충돌나면 참고Model이나 Form, Controller에제공되는 어노테이션을 이용해서 작업한후설정해서 http://localhost:8080/swagger-ui.html로 접속하면 된다

Spring Security OAuth2를 이용해 Google 로그인 연동 [내부링크]

OAuth2를 이용해 구글 로그인 연동을 해보았다먼저 Google Cloud Platform에 들어가서 파란색 화살표가 가르키는 부분을 눌러준다그러면 새 프로젝트를 눌러서 새로 프로젝트를 하나 만들어준다프로젝트 이름을 적어주고 만들기를 누르고 프로젝트를 생성해준다그리고 왼쪽 메뉴바에 OAuth 동의 화면을 클릭해보면이런 창이 뜰텐데 외부를 선택하고 만들기를 눌러준다빨간색 별표가 있는 필수 항목들만 입력하고 다 건너뛰기를 눌러줘서 진행한다그러면 클라이언트 id랑 비밀번호를 발급해주는데 이것은 설정에 꼭 필요하니 따로 빼두거나 나중에 다시 들어와서 확인해도된다그리고 승인된 리다이렉션 URL.......

JWT를 이용해 api 형식으로 로그인 구현 [내부링크]

의존성 추가먼저 스프링 시큐리티와 JWT토큰 의존성을 추가해야한다Spring Security 흐름도스프링 시큐리티 jwt생성 하는걸 한번 그림으로 그려봤다이렇게 스프링 시큐리티가 흘러간다그림으로 그려보니 더 머리속에 잘들어오는것 같다JWT토큰 생성원한다면 payload에 data를 더 추가해도된다JWT생성 클래스는 빈으로 추가해줬다(만료정보 이런건 나중에 권한 인증할때 추가하도록 하겠다)Spring Security 흐름1. 사용자가 username과 pw를 입력하면 POST방식으로 request가 일어난다2. AbstractAuthenticationProcessingFilter를 상속받은FormLoginFilter의 attemptAuthentication()메서드가 실행되고username, pw의 정보를 Log.......

[오류] JWT생성 중 USER, ClassCastException [내부링크]

시큐리티를 적용하는데 ClassCastException이 떴다...MemberContext는 User를 상속받는데PostAuthorizationToken의 Principal을 MemberContext에 담고MemberContext안에 있는 data를 이용해서 JWT을 생성해주는데 디버깅을 해보았는데 Principal에 "leebeomjun"이 담겨있었다Principal을 MemberContext로 변환하는 과정에서 String은 MemberContext로 바꿀수 없다고 나왔다그래서 그냥 생성자를 이용해서 값을 넣어줘봤다MemberContext는 username, password, autorities갖는데 이중 한개라도 null값이 오면 Exception을 일으켰다(username만 입력했기 때문)그래서 고민하다가 그냥 JWT를 생성하는 메서드에 MemberContext를 넣.......

[오류] Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' [내부링크]

스프링 시큐리티와 jpa를 같이 쓰는데 로그인할때 이와 같은 오류가 났다Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException그래서 오류가 생긴 곳들을 마커찍고 디버깅을 해보면서 찾아보았다회원 테이블인 Member와회원 권한 테이블은 1:N으로 맵핑되어있는데oneToMany는 기본이 지연로딩으로 설정되어있다(fetch)로그인된 정보로 시큐리티 Provider 에서 값을 비교해Member 객체를 가지고 오는데 지연로딩이니까 당연히 MemberRole까지는 가져오지않는다.아까 지연로딩으로 가져온 Member객체를 위와같이 넣고 MemberRole을 사용하려하는데한 트랜잭션 안에 모든게 끝나기때문.......

[오류] 시큐리티에서 Exception 처리한 메세지가 api에 안나올 때 [내부링크]

Exception에 메세지를 담겨서 throw했는데 제공하는 json message에 아무것도 담겨있지 않았다정말 이것때문에 엄청 시간을 소비했다ㅜ 왜안되지? 전에는 분명히 됐는데 이상했다devtools를 dependency에 추가해주니까 됐다나는 devtools가 html파일이 있을때 서버를 재시작 하지않아도 변경한게 나올수 있게 해주는 툴 로만 이해하고있었는데에러 정보까지 해줄 줄은 몰랐다캐싱에 관련이 있는걸까..? 정확한 이유는 몰라서 좀더 찾아봐야겠다!

[오류] org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [내부링크]

JpaRepository에서 @Query를 이용해 쿼리를 직접 짜주고 테스트를 해봤는데저런 오류가 떳다..보니까 @Transactional@Modifying이 두개를 안써줘서 생긴 오류였다Update를 할때는 저 두개를 꼭 적어주자!!!!

[오류] Junit5 Pageable 테스트시 파라미터 오류 [내부링크]

해커톤 대회 연습으로 서비스를 구현하고 있었다Junit5로 스프링 데이터 페이징을 테스트하고 있었는데파라미터 오류가 떴다org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [org.springframework.data.domain.Pageable 원래 코드는 Pageable을 test메서드 매개변수안에 선언했었는데 이부분에서 파라미터 오류가 뜬것같다그래서 이렇게 밖으로 빼주었더니 정상적으로 작동했다

@RequestBody, @RequestParam, @ModelAttribute차이 [내부링크]

@RequestBody-Http 요청의 body부분을 JSON으로 변환시켜주는 역할-POST 방식으로 넘어온 데이터를 객체로 바인딩-POST방식으로만 사용해야됨@RequestParam-요청 파라미터를 1:1로 받기 위해 사용-반드시 파라미터가 전송되어야한다(안되면 400error)-defaultValue로 값을 설정해 주던지 required를 false로 바꾸어서 값이 없어도 괜찮다하던지@ModelAttribute-요청된 여러개의 파라미터들을 1대1로 객체에 바인딩 해서 받을수 있음

[오류] Swagger 빌드 오류 날때(springfox.documentation.spring.web.plugins.DocumentationPluginsManager....) [내부링크]

springfox.documentation.spring.web.plugins.DocumentationPluginsManager.createContextBuilder이러한 오류가 났다RestApi 문서화를 위한swagger 2.9.2를 사용하려고 의존성을 추가했는데 어플리케이션을 시작하면 저 오류가 떴다...그래서 최신버전으로 바꿔봤는데최신버전인 swagger 3.0.0인건 아애 되지가 않았다3.0.0이 안되는 이유를 찾아봤는데 최신버전이라서 오류가 좀 있는것 같다 다른사람들도 잘 안된다고했다그래서 열심히 찾아보며 오류도 뒤져보며 삽을 판 결과.......!!!!!!!!!Hateoas랑 swagger랑 같이 사용하고 있었는데 두 개를 같이 사용해서 충돌이 난거였다버전 때문인지는 모르겠지만 암튼 두 개가 충돌이 난.......

[오류] Web server failed to start. Port 8080 was already in use [내부링크]

***************************APPLICATION FAILED TO START***************************Description:Web server failed to start. Port 8080 was already in use.빌드하는데 포트 8080이 사용중이라는 오류가 떴다분명히 중단시키고 다시 하는데 이상하게 오류가났다이럴때는 cmd창에 들어가서 8080의 프로세스를 강제로 삭제 시켜주면 된다netstat 라는 명령어를 사용하면 사용중인 프로세스와 포트번호를 알려주는데프로세스의 번호까지 알려주진 않았다그래서 netstat -ano | findstr : 80 을 사용해서 포트번호 80으로 시작하는 프로세스들을 번호가 보이게 찾아줬다(안되면 그냥 netstat -ano만)그리고 taskkill /f /pid [포.......

React랑 SpringBoot 연동 시키기 (Gradle) [내부링크]

서버는 스프링 부트를 이용한 api로 개발을 진행중이여서리엑트에서 axios를 이용해 api를 받아야하기 때문에 리엑트랑 스프링부트랑 연동시켜보려한다1. node.js를 다운받는다그러면 이런식으로 npm과 node뒤에 -v를 입력해 실행해보면 버전을 알수있다 -> 정상적으로 설치된것2. yarn을 설치해준다3. 프로젝트경로에 src/main으로 들어가서 create-react-app [생성할 폴더명] 이렇게 react 설치를 진행해준다(보통 스프링부트 프로젝트 src/main에 생성한다)여기까지 진행했다면 성공적으로 react를 설치한것이다(src/main/frontend 여기에 react가 설치됨)이제 스프링부트와 연동해보자스프링부트는 이미 프.......

[오류] Security 적용중 타임리프 css, js적용 안될때 [내부링크]

시큐리티를 적용중인데 타임리프 static의 css랑 jss가 적용이안돼서 너무 힘들었다..결국 해결했다..mvcMathcers에 "/static/** 추가해도 안됐고 HttpSecurity configure에 antMatchers("/static/**).permitAll도 안됐다이렇게 아애 requestMathcher로 static요청을 처리해줘야한다(추가) /img/**, /js/**, /css/** 이런식 처리도가능하다

Thymeleaf사용시 get파라미터 2개 사용하기 [내부링크]

하나는 이렇게 사용하는데두개가 자꾸 오류가 났다 오랜만에 써서 기억이 안나길래 타임리프 홈페이지도 뒤지고 구글도 뒤져봤지만 안나왔다.....계속 시도 끝에이렇게 파라미터 사이에 , 만 찍어주면 된다

자바 메일 SMTP 오류코드 참고 [내부링크]

SERVER REPLY: 501 Denied domain name: 도메인주소를 잘못 입력 or 수신측에서 도메인을 수신거부한 경우 421 Server too busy.: 수신측 서버의 응답지연. 수신서버의 트래픽등으로 메일을 수신 받지 못하는 상황임 421-Microsoft ESMTP MAIL Service, Version: 5.0.2195.5600 ready at Service notavailable, closing transmission channel: MS사의 smtp 서버의 장애로 인해 메일을 수신받지 못하는 상황 421 4.3.2 Your IP(xxx.xxx.xxx.xxx) is filtered and this connection will be closed.You must register your IP to [email protected] By SpaceLee, the Lord of mailserver.: 외부에서 @bbb.com 으로로 메일을 발송시 CHOL수신.......

JSP프로젝트에서 파일 업로드를 했는데 지정해둔 폴더에 안들어갈때 [내부링크]

파일을 업로드해도 계속 프로젝트 내에 지정한 폴더에 들어가지 않고 이상한 경로에 저장이되는데파일 읽기하면 또 올바르게 읽어져서 이상하게 여겨서 이것저것 찾아보앗다.만약 내가 경로를 지정해줬는데uploadPath를 찍어보면 밑 처럼 나온다C:\Users\LeeBeomJun\eclipseworkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps이런식으로 경로가 좀 이상하게 나오면현재 개발중인 프로젝트 폴더 경로가 아닌 workspace의 경로에 복사를 하여 컴파일하고 동작한다는 것인데(tomcat사용시)이것을 퍼블리싱이라고 한다(Publishing)server들 멈추고 더블클릭해서 설정창으로 간 다음에Serve modules without publ.......

[학교 웹프로젝트] 이벤트 정보 사이트(MVC2 + Oracle + JSP) [내부링크]

학교에서 웹 프로젝트를 하는데 평소에 연인이나 부모님께 이벤트를 하려고해도 인터넷에 찾아봐도 정보가 많지 않아서직접 만들어보기로 하였습니다.저희 팀원은 5명이고 제가 DB설계와 백엔드를 담당하고 나머지 4명이 프론트를 담당하여 진행하였습니다.다들 처음이여서 제가 리드를 하였고 팀원들이 잘 따라준 덕분에 잘 마무리 할 수 있었습니다.프론트엔드 HTML + CSS + JS 백엔드 MVC2 + Oracle + JSP로 작업하였습니다[웹설계도][DB설계도][시연영상][소감]이 프로젝트를 MVC2패턴으로 진행하면서 DispatcherServlet에 대한 이해도가 상승했고 어노테이션이 아닌 직접 싱글톤으로 Controller, Service, Repo.......

JSP - 회원 비밀번호 찾기 이메일 전송으로 구현하기 [내부링크]

비밀번호 찾기를 누르면 메일로 인증코드가와서 인증코드를 입력하면 비밀번호를 바꿀수 있게 구현했다(메일 설정에서 POP3/SMTP을 사용함으로 바꿔줘야됨)인증코드를 랜덤으로 영어 대문자랑 숫자랑 섞이게 만들었고sendEmail라는 메서드는 매개변수로 메일을 받을 상대의 이메일 주소를 적게 만들었다(프로젝트 게시판에 이벤트정보사이트 보면 시연확인가능)(MVC2 패턴 적용)[MemberRepository]회원 Repository(dao)[MemberService]비지니스코드가 들어있는 Service단[InputPwCodeOkCommand]인증코드 확인 Command[InputNewPwOkCommand]새로운 비밀번호 입력 Command

[오류] 스프링데이터 사용시 Bean주입 완벽한데 오류날 때 [내부링크]

분명히 이러한 어노테이션으로 빈설정을 완벽히 했는데 자꾸 저런 오류가 떠서 계속 찾다가 첫번째 줄을 맨오른쪽으로 에러를 읽다보니 No property count found for type String! Traversed path: Member.name.이러한 오류가 있었다처음에 대강 보고 빈 주입 오류인줄 알고 계속 빈에 관한 세팅을 점검했는데 이상하게 틀린게 없어서 계속 시간을 소비하다가 가려져있던 글들을 보고 내가 스프링데이터에서 메서드 작성할때 먼가 틀렸다는것을 깨달았다이렇게 작성했었는데메서드명이 틀렸다오랜만에 스프링데이터를 다시 되짚어보니 잠시 해깔렸던것 같다올바르게 수정했더니 잘 작동한다

HATEOAS를 만족하는 rest api [내부링크]

api를 설계할 때 현재 페이지에서 이동가능한 정보들을 포함해서 만드는것을 말한다ex)게시글을 읽는 api -> 글 수정, 글 삭제, 글 리스트로 가기 링크 등이 포함 되어야한다.링크에는 크게 두가지 정보가 필요하다-href-relation(자기 자신 링크 : self)(응답 본문에 대한 링크 : profile)(글 수정, 삭제, 리스트 등등)hateoas의 EntityModel을 상속시켜 Resource 라는 클래스를 만들어줬다데이터들은 data안에 담기고 EntityModel을 상속받았으니까 link도 add할수있다예를들자면관리자 측면에서 회원리스트가 있고 회원의 정보를 본다는 가정하에(단지 가정)특정 회원의 정보를 보는 메서드다(.withRel은 uri 이름, slash는 슬.......

스프링 REST Docs 만들기 [내부링크]

프로젝트를 하다보면 API 문서를 제공할 일들이 많은데WIKI같은곳에 정리하다보면 그때마다 업데이트 하기가 쉽지 않다그래서 이러한 문제를 해결해 주는게 REST Docs이다의존성을 추가하고test에 config를 만들어 Bean을 주입한다(이러면 문서가 가독성이 좋아진다 prettyPrint)그 후 ControllerTest에서@Import와 @AutoConfigureRestDocs를 해준다 이제 Test에 Rest Docs를 작성해주면된다문서 만드는 법은 보통-요청 본문 문서화-응답 본문 문서화-링크 문서화-요청 헤더 문서화-요청 필드 문서화-응답 헤더 문서화-응답 필드 문서화이런 구성으로 만든다앞에서 링크를 문서화 했는데뒤에 응답 필드 문서화에서도 또 하라고 나온.......

간단한 회원 가입 api 구현, 예외 처리(Error) [내부링크]

Controller만들어둔 Error가 있다면 badRequest를 호출하며 에러 메세지를 보낸다Service중복 회원 일시에 rejectValue로 error 기입(아이디를 name으로 가정했다)ErrorError클래스는 Json형태가 아니기때문에 JsonSerializer를 사용해 배열을 생성한후필드에러, 글로벌에러 마다 json오브젝트를 만들어줬다

간단한 회원 조회 api 구현 [내부링크]

못찾았을때는 404에러를 발생시키고Entity를 DTO로 변환시켜 MemberResource안에 담아서 return

[오류]EntityModel 상속시 생성자 링크 오류(super) [내부링크]

이렇게 EntityModel을 상속받아 MemberResource를 만들어서MemberResource객체가 생성될때 생성자를 통해서 자기 자신의 링크를 추가하게 해주었다처음에는 super(memberDTO, links)를 빼고 작성했는데 이것이 "org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Embedded wrapper org.springframework.hateoas.server.core.EmbeddedWrappers$EmbeddedCollection@67b7ad8e returned null for both the static rel and the rel target type!라는 오류를 불러왔다JSON으로 변환이 안됐고 null로 보아서 어딘가에서 오류가 난건데 계속 찾아보니 MemberResource의 생성자를 통해 링크를 추가해.......

간단한 회원 수정 api 구현 [내부링크]

MemberDTO에서 Validation 체크가 되고 오류가 있으면Errors의 hasErrors을 통해 badRequest를 발생시킨다찾을수 없는 회원이면 notFound를 발생시킨다MemberDTO의 Validation은 대강 @NotBlank로 간단하게 구현했다

간단한 회원 목록 조회 api 구현 [내부링크]

전체 회원목록을 조회하는 api controller스프링데이터의 페이징 기능을 이용했고 Member를 api스팩에 맞추어 MemberDTO로 변환을 하여 사용했으며PagedResourcesAssembler를 사용해 페이징 링크와 회원 하나하나 조회하는 링크도 추가해줬다EntityModel을 상속받는 MemberResource 클래스를 만들어줘서 회원 하나 하나에 링크를 붙여줄수 있게 생성자를 만들어줬다필요시 profie링크 정보를 추가해주면 된다

[JSP 오류] org.apache.catalina.core.ApplicationDispatcher invoke [내부링크]

JSP로 프로젝트를 하나 진행하고있는데 맨날 스프링만 써서 그런지 싱글톤을 적용시킬때 이런 오류가 계속 났다(처음 MemberRepository 객체를 사용할때는 정상작동하는데 다시 MemberRepository를 호출할때 오류가 남)오류의 원인은 싱글톤 패턴이아니였다싱글톤 패턴은 객체 생성시 딱 한번 생성자가 호출되면서 객체를 만들며 그걸 계속 사용하는것인데바보같이 conn = DriverManager.getConnection(DB.URL, DB.USERID, DB.USERPW); DB 연결하는 부분을 생성자안에다가 넣어놨었다.그래서 메서드마다 처음에 DB연결을 하게 바꾸었더니 정상작동하였다.스프링으로 어노테이션으로 편하게 개발을 하였는데이참에 JSP MVC.......

MYSQL + JDBC 연결 [내부링크]

mysql-connector-java.8.0.21.jar를 WEB-INF 폴더에 넣기(못찾겠으면 따로 다운받아도됨)DRIVER, URL, ID, PW 세팅본인은 생성자로 드라이버 불러오게 만듬메서드 실행시마다 getConnection으로 DB연결객체 생성후 메서드 test정상적으로 작동

[JSP 오류] class java.lang.Integer cannot be cast to class java.lang.String [내부링크]

Controller에서 setAttribute해준후jsp에서 result를 getAttribute로 불러올때 오류가 생겼다(result는 int형)위 코드처럼 int형인 result값을 나는 getAttribute는 Object형이라고 생각했고String으로 변환하고 int로 바꾸는것보다그래서 바로 String으로 변환하는게 더 효율적이라고 생각해서 바로 저렇게 해줬었다그랬더니 오류가 생겼다오류 발생 원인은 Int타입을 바로 String으로 캐스팅할때 발생하는 오류이다그래서 이렇게 해줘야한다그래서 나는이렇게 사용했다. 담부턴 주의해서 사용해야겠다.

BFS, DFS, 프림, 크루스칼 [내부링크]

BFS는 queue를 이용해서 지금 위치에서 갈수있는 모든 곳을 모드 큐에 넣는 방식이다(queue를 넣는 시점에서 해당 노드를 방문했다고 체크)DFS는 stack을 이용해서 갈수있는 곳까지 최대한 깊게 탐색하고 더이상 갈곳이 없다면 이전 정점으로 돌아간다최소 신장 트리(MST)-간선이 가중치를 가질때(거리를 가질때)-가중치의 합이 가장 작은트리최소 신장 트리에는 프림 알고리즘과 크루스칼 알고리즘이 있다

Git 푸시 오류 Logon failed [내부링크]

소스트리를 사용중인데 노트북과 PC둘다 작업을 하고싶어서 노트북에도 추가로 깃에 연동을 시키고있었다갑자기git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks push -v --tags origin main:main Logon failed, use ctrl+c to cancel basic credential prompt.Pushing to..오류가 나면서 완료됨.자꾸 로그인을 하라는 말과 로그인을 하면 자꾸 이런 말도안되는 오류가 떠서몇시간을 고생했는지 모른다..소스트리에서 도구 -> 옵션 -> Git 으로 들어가서Git버전에 Embedded, Update Embedded, System, Clear path cache가 있는데 여기서System을 클릭해주면 된다.노트북 소스트리.......

Spring Security의 BCryptPasswordEncoder를 이용한 암호화, 비빌번호 비교 [내부링크]

스프링 부트에서 유용하게 BCryptPasswordEncoder를 이용해서 암호화를 사용했었다BCryptPasswordEncoder에선 복호화가 되지않으므로 matches 함수를 이용해 비교했었다jsp프로젝트를 하는데 이걸 이용해서 비밀번호 암호화를 하고싶어Spring Security에 있는 클래스를 뒤져보고 클래스를 만들어주어 사용했다이렇게 사용하면 된다DB에 잘 저장되고 암호화도 잘된다

시험기간 [내부링크]

~시험기간~

[HTML] css기초 다시 알아보기1 [내부링크]

style 태그는 반드시 head안에서만 작성해야한다style 태그는 여러번 사용 가능인라인 스타일 시트외부 스타일 시트를 적용하러면<style 우선순위>1. 인라인 스타일 (<p style=""></p>)2. style 속성 (<head><style> ... </style></head>)3. external.css (외부 스타일)4. 디폴트 스타일(1이 제일높고 4가 제일 낮음)classidid는 여러 태그들 중에 특정 태그에만 css를 입힐때 사용class는 여러 태그를 하나의 그룹으로 묶어서 동일한 css를 입힐때

JSP 개념 다시 잡기1 [내부링크]

서블릿이란?-서블릿은 자바를 이용한 서버 프로그래밍 기술이다JSP의 특징-자바의 모든 기능을 사용할 수 있어 발전 가능성이 무한하다-서블릿으로 컴파일된 후 메모리에서 처리되기 때문에 많은 사용자의 접속도 원활하게 처리할 수 있다-JSP 또는 다른 서블릿 간의 데이터를 쉽게 공유 할 수 있다-Beans 라고 하는 자바 컴포넌트를 사용할 수 있다-커스텀 태그를 만들어 사용할 수 있으며, JSTL과 같은 태그 라이브러리를 이용할 수 있다-스트러츠, 스프링 @MVC등 다양한 프레임워크와 결합하여 개발할 수 있다JSP의 전체 동작 과정JSP는 HTML과 유사한 처리 과정을 거치나HTML이 단순 서버 파일을 브라우저로 보내주는 것에 비해.......

Spring Security란? [내부링크]

스프링 시큐리티(Spring Security)란?스프링 시큐리티는 스프링 기반의 어플리케이션의 보안(인증과 권한)을 담당하는 프레임워크접근 주체(Principal) : 보호된 대상에 접근하는 유저인증(Authentication) : 인증은 '증명하다'라는 의미로 예를 들어, 유저 아이디와 비밀번호를 이용하여 로그인하는 과정인가(Authorization) : '권한부여'나 '허가'와 같은 의미로 사용, 어떤 대상이 특정 목적을 실현하도록 허용(Access) 하는 것을 의미권한 : 인증된 주체가 애플리케이션의 동작을 수행할 수 있도록 허락되었는지를 결정할 때 사용스프링 시큐리티 필터(Spring Security Filter)스프링 시큐리티는 다.......

스프링 데이터 JPA - 벌크연산(@Modifying), fetch join(@EntityGraph) [내부링크]

JPA에서 배운 벌크연산 쿼리를 Spring Data JPA에서 쓰는 방법이다벌스연산이란 특정 데이터들 또는 전체 데이터들을 한번에 쿼리로 업데이트 해주는걸 의미한다벌크연산을 JPA에서 이용할 경우벌크연산을 Spring Data JPA에서 이용할 경우기존의 JPA에선 벌크연산을 사용할때 영속성 컨텍스트를 무시하고DB에 직접 쿼리가 들어가서 주의점이 있었지만주의점 : 같은 트랜잭션 안에서 조회를 할때 Update가 영속성 컨텍스트를 무시하고 DB에 바로 접근하기 때문에Update된 정보를 조회할수 없는 점이있다(해결책은 jpa 포스팅 참고)암튼 스프링 데이터 JPA에서는직접 초기화 할 필요없이 메소드 위에다가어노테이션.......

스프링 데이터 JPA - 변경 최적화(@QueryHints, Transational(readOnly = true), @Lock [내부링크]

@QueryHints변경감지를 할려면 원본까지 같이 있어야지 가능하다 그래서 하이버네이츠는 객체를 두개를 가지고 변경감지를 한다내가 변경할 일이 없을때 객체를 두개가지고 있으면 비효율적이다(메모리를 더 먹음)그래서 스프링 데이터 JPA에서 @queryHints로 이렇게 변경안하고 읽기전용으로 바꾸어서 최적화를 해줄수 있다(최적화를 해도 성능이 그렇게 많이 좋아지지는 않지만 트래픽이 심한 부분에 해주면 약간의 효과를 볼 수있다)Spring 5.1 버전 이후에서는 이것만 설정해주면 @queryHint의 readOnly까지 작동한다@Lock낙관적락- 트랜잭션 대부분은 충돌이 발생하지 않는다고 낙관적으로 가정하는 방법이다- 이것은 데.......

스프링 데이터 JPA - 사용자 정의 리포지토리(RepositoryImpl), Auditing(등록일, 수정일, 등록자, 수정자) [내부링크]

순수 JPA사용, QueryDsl, JdbcTemplate, Mybatis와 같은걸 추가해서 쓰려면사용자 정의 리포지토리를 이용하는게 좋다먼저 [레포지토리명 + Custom] 이라는 Interface를 만들고 메소드를 정의해준다그리고 ~RepositoryImpl라는 클래스를 만들어 implements하고오버라이딩하여 메소드를 구현해준다(무조건 클래스명을 [엔티티명 + Repository + Impl] 로 만들어줘야한다)그리고 스프링데이터 JPA와 함께 만든 클래스를 추가로 상속받으면 스프링데이터 JPA와 함께사용자 정의 리포지토리안에 있는 메소드들을 MemberRepository에서 사용할수 있다단순 조회용 DTO쿼리나 통계 쿼리 이런건 Repository를 쪼개서 Repository 2개로 만들.......

스프링 데이터 JPA - 편리한 페이징 [내부링크]

스프링 데이터 JPA에서 페이징기능을 제공한다(밑 예제는 API 전송시 DTO로 변환)세부사항 변경은 @PageDefault로 변경해주는 방법과application.yml에 글로벌 세팅을 해주는 방법이 있다위에 변환을 이렇게 간단하게 바꿀수 있다(MemberDTO에 생성자에서 Entity를 get하는건 괜찮다)람다식이용페이징 정보가 둘 이상이면 접두사로 구분한다스프링 데이터는 Page를 0부터 시작하게 Default되어 있는데Page를 1부터 시작하려면 방법이 두가지가 있는데첫번째 방법은 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘기고 응답값도 Page 대신에 직접 만들어서 제공하는 방법이 이다두번째 방법은 글.......

스프링 데이터 JPA - save시 key값에 따른 주의사항 [내부링크]

스프링 데이터 JPA의 save 메소드는 이렇게 구현이 되어있다.이런식으로 Pk값의 시퀀스를 알아서 생성하게@GeneratedValue로 지정해주면 save시에 id값이 null이면 em.persist를 호출하게 되어있다 하지만 Pk값을 사용자가 알아서 지정해주려고이런식으로 @GeneratedValue를 안쓰는 경우일 때0으로 판단하여 merge가 호출된다merge는 전에 포스트에 적었던것 처럼 사용해서는 안되고무조건 변경 감지를 이용해야한다그래서 @GeneratedValue를 사용못하는 경우 일때는Persistable 인터페이스를 구현해서 로직을 변경할수 있다거기다가 @CreatedDate를 추가하면 더 편리하게 사용할수 있다save()로인해 isNew가 호출되면처음에 created.......

[오류] proxy.pojo.bytebuddy.ByteBuddyInterceptor 오류, 무한 루프, api 엔티티 직접 노출 단점 [내부링크]

지연 로딩을 이용할 경우 객체에 프록시 객체를 생성해서 넣어 놓게 되는데 json으로 뽑을 때 이것 때문에 오류가 생긴다hibernate5를 gradle에 등록하고스프링 빈에도 등록해주면 된다이렇게 강제로 지연로딩을 먼저 해주고 json으로 뽑아줄수도 있다하지만 엔티티를 직접 노출 하는거고 이렇게 다 끌고오면 성능상 문제가 있을수 있다(api 규정이 이럴때 뺴고)그래서 Hibernate5 force.Lazy는 쓰기 애매해서 이런식으로도 가능하다하지만 다 엔티티를 직접 노출하는거라 이런것들은 다 좋은 방법이 아니다(엔티티 변경시 api 스펙이 달라지기 때문에)또한 필요없는 api 정보들을 다 노출하기 때문에 좋지 않.......

Spring Boot + JPA API 조회 성능 최적화 [내부링크]

쿼리 방식 선택 권장 순서 1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다 2. 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다3. 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다엔티티를 DTO로 변환하거나, DTO로 바로 조회하는 두가지 방법은 각각 장단점이 있다. 둘중 상황에 따라 서 더 나은 방법을 선택하면 된다. 엔티티로 조회하면 리포지토리 재사용성도 좋고, 개발도 단순해진다<일반 조회>조회에만 필요한 DTO(재사용성이 없으나 성능이 좋다)순수 엔티티를 조회하는.......

스프링 데이터 JPA - gradle, application.yml, Spring 설정 [내부링크]

gradleapplication.yml스프링 설정(Spring Boot이용시 생략 가능)김영한 강사님의 인프런 강좌를 들으면서 공부중입니다

스프링 데이터 JPA - CRUD [내부링크]

JpaRepository를 상속받고 Entity 클래스와 id값의 자료형을 넣어주면스프링 데이터 JPA가 프록시로 구현클래스를 만들어서 injection 해준다스프링데이터 JPA를 사용하면 이러한 JPA로 직접 구현해야하는 CRUD같은 기능들과 추가적인 다른 기능들을직접 구현하지 않고 이용할수 있게 해준다<=>김영한 강사님의 인프런 강좌를 들으면서 공부중입니다

JPA - Entity, 값타입 Setter 금지에 대해 [내부링크]

엔티티나 값타입을 작성할때 getter와 setter를 만들곤한다하지만 복잡한 로직에서 setter를 만든경우엔 유지보수성이 떨어진다그래서 최대한 Setter를 쓰지않고 만들어야 한다위 코드가 복잡해질 경우 객체의 변경에서 한번에 알아볼수가 없고객체를 create하거나 update할때 빼먹은 부분도 생기기 마련이다이런식으로 Setter를 사용하지 않고 필요한 부분마다 메소드를 만들어서 사용하면객체 지향 관점에서도 알맞고 유지보수성도 올라간다다른 사람이 객체를 생성할때 올바르지 않게 생성하는걸 막기위해이러한 두개의 방법으로 new Member()를 접근제어 할수 있다

스프링 데이터 JPA - 쿼리 메소드(메소드 이름, NamedQuery, @Query), 반환타입 지정 [내부링크]

쿼리 메소드조회: find…By ,read…By ,query…By get…By예:) findHelloBy 처럼 ...에 식별하기 위한 내용(설명)이 들어가도 된다. COUNT: count…By 반환타입 long EXISTS: exists…By 반환타입 boolean 삭제: delete…By, remove…By 반환타입 long DISTINCT: findDistinct, findMemberDistinctBy LIMIT: findFirst3, findFirst, findTop, findTop3ex) 회원들중에 username = ?, age > ? 인 회원을 찾는 JPA 구현쿼리 메소드NamedQuery를 스프링 데이터 JPA로 실행<Member, Long>에 적어준 Member에서 findByUsername을(NamedQuery)를 찾아줘서@Query는 없어도됨@Query로 JPQL로 바.......

스프링 데이터 JPA - 페이징 [내부링크]

원래라면 이렇게 JPA로 페이징을 짜아하는데스프링 데이터 JPA를 이용하면 이렇게 편리하게 페이징 처리가 가능하다테스트 코드API를 이용할때는 Entity를 바로 반환하면 안되므로 DTO로 바꿔서 반환한다김영한 강사님의 인프런 강좌를 들으면서 공부중입니다

JPQL - 서브쿼리(EXISTS, ALL, ANY, SOME, IN), 타입 표현, CASE식, 함수 [내부링크]

서브 쿼리의 한계JPA는 WHERE, HAVING 절에서만 서브 쿼리 사용 가능 SELECT 절도 가능(하이버네이트에서 지원) FROM 절의 서브 쿼리는 현재 JPQL에서 불가능 조인으로 풀 수 있으면 풀어서 해결[NOT] EXISTS (subquery)서브쿼리에 결과가 존재하면 참 (NOT은 반대) {ALL | ANY | SOME} (subquery)(위 3개를 섞어 쓸수 있다) ALL 모두 만족하면 참 ANY, SOME 조건을 하나라도 만족하면 참(any,some은 같은 의미) [NOT] IN (subquery)서브쿼리의 결과 중 하나라도 같은 것이 있으면 참JPQL 타입 표현문자 : 'HELLO', 'She''s'숫자 : 10L(Long), 10D(Double), 10F(Float)Boolean : TRUE, FALSEENUM : (패키지.......

JPQL - 경로 표현식, 명시적 조인, 묵시적 조인 [내부링크]

상태 필드(state field)단순히 값을 저장하기 위한 필드 (ex: m.username) 연관 필드(association field)연관관계를 위한 필드 단일 값 연관 필드@ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) 컬렉션 값 연관 필드@OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders) 명시적 조인 이란?join 키워드를 직접 사용하는 것묵시적 조인 이란?경로 표현식에 의미 묵시적으로 join이 발생하는 것(내부 조인)ex)가급적으로 묵시적 조인 대신에 명시적 조인을 사용하자(묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기가 어렵기 때문에)김영한 강사님의 인프런 JPA강좌를 들으면서 공부.......

JPQL - 페치 조인(엔티티, 컬렉션), 페치 조인과 일반 조인의 차이, 주의사항 [내부링크]

페치 조인(fetch join) 이란?- SQL 조인 종류가 아니다- JPQL에서 성능 최적화를 위해 제공하는 기능- 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능- join fetch 명령어 사용- 즉시로딩하고 똑같은데 페치 조인은 쿼리로 내가 원하는 객체 그래프를 명시적, 동적으로 뽑을수 있다엔티티 페치 조인회원이 100명 있다고 가정하고 지연로딩으로 조회할 때회원이 다 다른팀 소속이라면최악의 경우는 SQL이 101번 나간다(처음 SELECT문 + 회원찾는 SQL)페치 조인(fetch join)을 이용한다면?컬렉션 페치 조인(일대다)일대다 페치 조인은 조심해야 할 이유가 있다중복을 없애기 위해선?dist.......

JPQL - 다형성 쿼리, Named 쿼리, 벌크 연산 [내부링크]

TYPETREAT(JPA 2.1)자바의 타입 캐스팅과 유사 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용 FROM, WHERE, SELECT(하이버네이트 지원) 사용엔티티 직접 사용 - 기본 키 값JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용엔티티 직접 사용 - 외래 키 값Named 쿼리 - 정적 쿼리미리 정의해서 이름을 부여해두고 사용하는 JPQL 정적 쿼리 어노테이션, XML에 정의할 수 있다애플리케이션 로딩 시점에 초기화 후 재사용 애플리케이션 로딩 시점에 쿼리를 검증개발할 때 가장 좋은 에러는 컴파일 할때 나는 오류이다 -> 어플리케이션을 실행하면 즉시 잡을수 있어서하.......

Spring Boot - Gradle, JPA, DB 개발 환경설정, 간단한 Test [내부링크]

Gradleapplication.ymlMemberMemberRepositoryjunit5 테스트

Restful API 설계 규칙 [내부링크]

Application Programming Interface<규칙>URI는 정보의 자원을 표현해야 한다자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)으로 표현한다URL의 의미중 명사가 resource, 동사를 메소드로 만든다resource의 스토어 이름으로는 복수 명사를 사용해야 한다슬래시(/)는 계층 관계를 나타낸다 URI의 마지막엔 슬래시(/)를 포함하지 않는다 가독성을 높이기 위해 하이픈(-)을 사용할 수 있으나 언더바(_)를 사용하진 않는다. URI 경로에는 소문자를 쓴다파일 확장자는 URI에 포함하지 않고 Accept header을 사용합니다리소스간 연관관계가 있는 경우ex) members/{id}/skills<메소드>GET: .......

JPA - 병합(Merge), 수정 [내부링크]

준영속 엔티티를 수정하는 방법변경 감지 기능 사용 트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 트랜잭션 커밋 시점에 변경 감지(Dirty Checking)이 동작해서 데이터베이스에 UPDATE SQL 실행병합( merge ) 사용1. 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회한다 2. 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다(병합한다) 3. 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행 주의사항변경 감지 기능을 사용하면 원하는 속성만 선택해서 변경할 수 있지만, 병합을 사용하면 모든 속성이 변경된다 병합시 값이 없으면 null 로 업데이트 할 위험도 있다(병합은 모.......

JPQL - 페이징(setFirstResult, setMaxResults) [내부링크]

setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작) setMaxResults(int maxResult) : 조회할 데이터 수김영한 강사님의 인프런 JPA강좌를 들으면서 공부중입니다

JPQL - 조인(inner, outer, theta, on) [내부링크]

내부 조인외부 조인 세타 조인ON절을 활용한 조인(JPA 2.1부터 지원) 1. 조인 대상 필터링 2. 연관관계 없는 엔티티 외부 조인(하이버네이트 5.1부터)김영한 강사님의 인프런 JPA강의를 들으면서 공부중입니다

JPA - 값 타입 컬렉션(@ElementCollection, @CollectionTable) [내부링크]

값 타입을 하나 이상 저장할 때 사용(일대다) @ElementCollection, @CollectionTable 사용 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다 컬렉션을 저장하기 위한 별도의 테이블이 필요함값 타입 저장값 타입 조회값 타입 수정- 값 타입은 엔티티와 다르게 식별자 개념이 없다- 값은 변경하면 추적이 어렵다- 값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장한다- 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본 키를 구성해야 함: null 입력X, 중복 저장X너무 복잡하다 그래서실무에서는 상황.......

JPQL - TypeQuery, Query, 파라미터 바인딩, 집합, GROUP BY, HAVING, ORDER BY [내부링크]

- JPQL은 객체지향 쿼리 언어- 따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리- JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존X- JPQL은 결국 SQL로 변환집합count: 결과 수를 구한다 (반환 타입: Long)MAX, MIN: 최대, 최소 값을 구한다. 문자, 숫자, 날짜 등에 사용된다AVG: 평균값을 구한다. 숫자타입만 사용 가능하다 (반환 타입: Double)SUM:합을 구한다. 숫자 타입만 사용할 수 있다1. NULL값은 통계에 잡히지 않는다.2. 값이 없는데 SUM, AVG, MAX, MIN함수를 사용하면 NULL. COUNT는 0이 된다.3. DISTINCT를 집합 함수안에 사용해서 중복된 값을 제거하고 나서 집합을 구할수 있다.......

@MappedSuperclass VS @Embeddable(임베디드 타입) [내부링크]

둘 다 비슷한 기능을 하기 때문에 어느 상황에 어떤걸 써야 할지 고민이 많았다정리를 하자면@MappedSuperclass로 정의하면 Entity로 정의하는 것이고 여러 Entity에 공통적으로 적용해야 할때 사용할 수 있고@Embeddable으로 정의하면 Value 타입으로 정의하는 것이고 비슷한 속성을 가지는 애트리뷰트를 하나의 값으로 만들어 재사용성을 높일수 있는 방법이다또한@MappedSuperclass는 상속이며@Embeddable은 위임이다상속은 다중상속도 안되고 객체지향 설계상 유연성이 떨어진다따라서 가급적이면 위임인 @Embeddable을 써야한다@MappedSuperclass가 사용될때는 한가지 경우만 있는데[ ex) 수정시간, 등록시간, 수정자, .......

JPQL - 프로젝션(어떤걸 select할지) [내부링크]

프로젝션 이란?select절에 조회할 대상을 지정하는 것DISTINCT 로 중복제거 가능JPQL로 조회한것들은 다 영속성 컨텍스트에 관리된다(set으로 업데이트 가능 )여러 값 조회(찾으려는 값이 String, int등으로 구성되어 있을 때) 1. Query 타입으로 조회 2. Object[] 타입으로 조회 3. new 명령어로 조회 -> 셋중 이걸로 사용하면 된다김영한 강사님의 인프런 JPA강의를 들으면서 공부중입니다

OSIV(Open Session In View) 최적화 [내부링크]

최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커...

JPA - 프록시 getReference() [내부링크]

연관관계가 매핑되어있는 테이블이 있을때예를들어 회원 테이블이있고 거기에 연관관계로 팀테이블이 매핑되어있다고 가정하면멤버를 조회할 때 팀은 조회할 필요없는 경우가 있다em.find(Member.class, pk값)으로 멤버를 조회할 때팀은 필요가 없는데 자꾸 팀까지 가져오면 낭비다이 때 프록시를 사용하면 엔티티가 사용될 때 까지 조회하지 않고 있다가 필요할 때 조회해준다프록시 란?- 실제 클래스를 상속받아서 만들어진다- 실제 클래스와 겉 모양이 같다- 사용자는 진짜 객체인지 프록시 객체인지 구분안하고 사용하면 된다- 거의 안쓰긴 하지만 즉시 로딩과 지연 로딩을 이해하기 위해 알아야한다특징1. 처음 사용할 때 한.......

JPA - 지연 로딩, 즉시 로딩(LAZY, EAGER) [내부링크]

회원만 조회할 때회원 테이블에는 id, username, team의 정보가 있다team은 조회할 필요가 없을 때 회원을 em.find로 조회를 하면team이 join형식으로 계속 조회되기 때문에 성능상 좋지않다 회원 엔티티에 team에다가 fetch = FetchType.LAZY 적용 -> 지연 로딩그러면team에 지연 로딩을 걸었기 때문에 회원 조회하면 team을 제외한 회원만 조회가 된다이 때 팀은 프록시로 생성이 된다팀의 속성을 사용하는 시점에 프록시 객체가 초기화되면서 쿼리문이 나가고 DB에서 값을 가져온다회원과 팀을 같이 조회할 때회원 엔티티에 team에다가 fetch = FetchType.EAGER 적용 -> 즉시 로딩실무에선 지연 로딩.......

JPA - 영속성 전이(CASCADE), 고아 객체 [내부링크]

CASCADE 란?- 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용ex) 부모를 저장할때 연관된 자식들도 다 persist하고 싶을 때주의 : 연관관계 매핑과 관련 X, 연관된 엔티티도 영속화 해주는 편리함만 제공• ALL: 모두 적용 (Parent지우면 Child도 다 지워짐)• PERSIST: 영속Child의 연관 관계가 한 개 일때 만 사용가능(Child의 소유자가 한 명 일때) 고아 객체 제거 란?- 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제해주는 기능orphanRemoval = true참조하는 곳이 하나일 때 사용 가능(특정 엔티티가 개인 소유 할 때)@OneToOne, @On.......

JPA - @Embeddable, @Embedded, @AttributeOverride, 값타입의 불변과 부작용 [내부링크]

임베디드 타입@Embeddable: 값 타입을 정의하는 곳에 표시 @Embedded: 값 타입을 사용하는 곳에 표시 기본 생성자 필수장점1. 재사용2. 높은 응집도 3. Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소 드를 만들 수 있음4. 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티 티에 생명주기를 의존함임베디드 타입은 엔티티의 값일 뿐이다. 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다. 객체와 테이블을 아주 세밀하게(find-grained) 매핑하는 것이 가 능 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래 스의 수가 더 많음@AttributeOverride: 속성 재정의 한 엔티.......

JPA - JPA에 대해서 [내부링크]

김영한 강사님의 인프런 강좌를 보면서 공부중입니다!!!JPA는 애플리케이션과 JDBC 사이에서 동작JAVA 애플리케이션에서 JPA에게 명령하면, JPA는 JDBC API를 사용해서 SQL을 만들어서 DB에 보낸다[JPA 동작]저장조회JPA를 왜 사용해야 하는가?SQL 중심적인 개발에서 객체 중심으로 개발생산성유지보수패러다임의 불일치 해결성능데이터 접근 추상화와 벤더 독립성표준[생산성]일반적인 SQL CRUD가 이런식으로 바뀐다저장 : jpa.persist(member)조회 : Member member = jpa.find(memberId)수정 : Member.setName("변경할 이름")삭제 : jpa.remove(member)[유.......

JPA - JPA설정(Maven), DDL [내부링크]

POM.xmlPersistence.xmldialect는 내가 사용하고 있는 데이터베이스를 구분해주기 위해서 있다ex) mysql, oracle은 sql문법이 다르다 그래서 이것을 jpa한테 알려주기 위함show.sql => sql을 콘솔창에 보여줌format.sql => sql을 이쁘게 적어줌use_sql_comments => 어디서 실행됐는지 알려줌name="Hibernate.hbm2dd1.auto" value="create" => 테이블이 없는경우 자동 생성(기존에 있던 테이블을 지우고 생성)스키마 자동생성시 주의할점들-개발 초기 단계 : create, update-테스트 서버 : update, validate-스테이징, 운영서버 : validate, none(가급적 쓰지.......

JPA - JPA 구동방식, JPA CRUD [내부링크]

1. Persistence 설정 정보 조회2. Persistence 생성3. EntityMangerFactory 생성(고객의 요청이 생길때 마다 EntityManager 생성후 close 반복)엔티티 매니저 팩토리는 하나만 생성해서 어플리케이션 전체에 공유엔티티 매니저는 쓰래드간의 공유 X(한번 사용하면 버려야됨)JPA의 모든 변경은 트랜잭션 안에서 수행해야한다생성삭제수정김영한 강사님의 인프런 JPA강의를 들으면서 공부중입니다

JPA - JPQL 맛보기 [내부링크]

-테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이다-SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다-JPQL은 객체 지향 SQLex)전체 회원 조회페이징김영한 강사님의 인프런 JPA강의를 들으면서 공부중입니다

JPA - 비영속, 영속성 컨텍스트 [내부링크]

영속성 컨텍스트의 장점1. 1차 캐시기본적으로 1차 캐시에 회원1이 저장되어있다고 한다면(방금 막 저장한 후)회원1을 찾는 em.find를 실행 시켰을때 DB를 거치지 않고 1차 캐시에 있는 회원1을 찾아서 반환해준다1차 캐시에 없는 회원2를 찾는 em.find를 실행 시켰을때는 DB에서 회원2를 찾고 회원2를 1차 캐시에 저장한후 반환시켜준다다음에 회원2를 찾을때는 DB를 거치지 않고 1차 캐시에서 찾을수 있게 해준다(1차 캐시는 같은 트랜잭션 안에서만 존재하기 때문에 엄청난 이점이 되지는 않는다)2.영속 앤티티의 동일성 보장자바 컬랙션에서 똑같은 reference가 있는 객체를 꺼내서 == 비교를 해줬을때 같은것.......

JPA - Entity Mapping Annotation(엔티티 매핑) [내부링크]

@Column@EnumeratedORIDINAL 사용 X@Temporal참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원) @Lob@Lob에는 지정할 수 있는 속성이 없다. • 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑 • CLOB: String, char[], java.sql.CLOB • BLOB: byte[], java.sql. BLOB @Transient필드 매핑X • 데이터베이스에 저장X, 조회X • 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용@Id, @[email protected]를 하면 auto_increment로 되는데 commit하고 SQL이 실행되기 때문에 id값.......

JPA - 단방향, 양방향, 일대일, 일대다, 다대일, 다대다(연관관계 매핑) [내부링크]

1) 방향단방향 관계 : 두 엔티티가 관계를 맺을 때, 한 쪽의 엔티티만 참조하고 있는 것양방향 관계 : 두 엔티티가 관계를 맺을 때, 양 쪽이 서로 참조하고 있는 것데이터 모델링에서는 관계를 맺어주기만 하면 자동으로 양방향 관계가 되어서 서로 참조하지만, 객체지향 모델링에서는 구현하고자 하는 서비스에 따라 단방향 관계인지, 양방향 관계인지 적절한 선택을 해야 한다양방향 매핑시 무한루프 조심(toString(), lombok, JSON 생성 라이브러리)2) 다중성Many To One - 다대일( N : 1 ) -> 가장 많이 씀One To Many - 일대다( 1 : N ) -> 가능하면 다대일 양방향으로One To One - 일대일( 1 : 1 ) -> DB 유니크 제약조.......

JPA - JOINED, SINGLE TABLE, TABLE PER CLASS(상속 관계 매핑) [내부링크]

JOINED: 조인 전략 • SINGLE_TABLE: 단일 테이블 전략 • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략=> 이것만 바꿔주면 테이블이 알아서 바뀐다[JOINED] -> 비지니스적으로 중요, 복잡할때[SINGLE TABLE] -> 테이블이 단순하고 확장될것 같지 않을때 [TABLE PER CLASS] -> 이거는 쓰면 X기본적으로 JOINED전략이 정석김영한 강사님의 인프런 JPA강의를 들으면서 공부중입니다

JPA - @MappedSuperclass [내부링크]

공통되는 앤티티가 있어서 이걸 많이 써야할때 @MappedSuperclass를 쓰면 편리하게 이용할수 있다-상속 관계 매핑이 아니다-엔티티도 아니다-테이블과 매핑도 안된다-조회, 검색 불가능-추상클래스로 생성 권장김영한 강사님의 인프런 JPA강의를 들으면서 공부중입니다

Intellij 자주쓰는 단축키 정리(제가 사용할 때 유용한 단축키) [내부링크]

Alt + Insert : 코드 생성 (Getters, Setters, Constructors,hashCode/equals, toString)Ctrl + O : 메서드 오버라이드 구현Ctrl + I : 인터페이스 메서드 구현Ctrl + Alt + T : 다음으로 코드 감싸기… (if..else, try..catch, for,synchronized, etc.)Ctrl + W : 가장 안쪽의 괄호부터 선택(점점 확장 된다.)Ctrl + Alt + O : import 문 최적화Ctrl + Alt + I : 줄단위 재정렬Tab / Shift + Tab : 들여쓰기/내어쓰기Ctrl + X or Shift + Delete : 잘라내기 (블럭 선택이 안되어 있으면 라인을 자름)Ctrl + C or Ctrl + Insert : 복사하기(블럭 선택이 안되어 있으면 라인을 복사)Ctrl + V or Shift + Insert : 붙여넣기Ctrl + D : 선택된 블럭.......

org.hibernate.LazyInitializationException 오류 [내부링크]

영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때 프록시를 초기화해서 문제가 발생한 것이다영속성 컨텍스트가 문제가 발생했는지 체크해야한다(존재하는지, 없어졌는지, 문제가 있는지, 트렌젝션 체크)보통 트렌젝션이 끝나고 영속성 컨텍스트가 없는데 조회를 해서 생긴 오류

[Silicon Valley 프로젝트] DB 설계(구독사이트 + 쇼핑) [내부링크]

백엔드를 맡은 내가 첨부터 끝까지 담당했는데 이것저것 따지다보니 쉽지않았다설계를 하면서 백엔드에서 로직을 어떻게 처리할까 와 같이 생각하다보니 DB가 여러번 수정되었다ㅜ(참조 무결성도 고려)(최종 수정된걸 올렸음)대충 설명하자면 [쇼핑몰 - 카테고리]월별 테마별로 상품 카테고리상품의 종류 카테고리[쇼핑몰-주문방법]상품을 구매하기를 누르면 바구니에 담긴다바구니로가서 상품을 뺄수 있으며 최종 결제를 누르면 주문테이블로 결제[쇼핑몰-취소]취소내역을 남기기위해 삭제말고 주문취소상태를 변경하여 취소[리뷰게시판]사진업로드하는 리뷰게시판[구독]한달에 한번만 가능한 구독[구독-취소]배송상태를.......

Spring Boot - 쇼핑 기능만들기 상품과 상품 카테고리 등록, 상품 조회(Thymeleaf + JdbcTemplate) [내부링크]

[상품 Repository][카테고리 Repository]-서비스는 캡처 생략-[Controller]상품을 등록하면 카테고리까지 같이 등록된다.잘 나온다다음에는 주문 기능, 주문 삭제, 장바구니 기능도 추가해야된다.

Spring Boot - 쇼핑페이지 페이징 추가 디자인추가(부트스트랩, Thymeleaf) [내부링크]

부트스트랩에서 이것저것 css를 손댔더니 좀더 이뻐졌다!기본 페이징 기능은 내 글목록에 있다

Spring Boot - 구독신청, 구독취소, 구독 확인(Thymeleaf + JdbcTemplate) [내부링크]

고려사항1. 구독취소는 배달이 출발 안했을 때만 취소 가능 (배달상태 테이블 check)2. 회원 탈퇴시 구독취소내역 삭제 X (취소상태 테이블의 값으로 구독취소유무 Check)3. 한 아이디당 한번의 구독만 가능[SubscribeController][SubscribeService][SubscribeRepository]

빌드와 배포란?? [내부링크]

막상 스프링부트를 이용해서 공부를 했지만빌드와 배포의 완벽한 정의는 모르고 있었다. 이 참에 이것저것 찾아보면서 공부를했다.빌드를 찾아보면 보통 컴파일과 빌드가 많이 나온다컴파일 이란?작성한 소스코드를 바이너리 코드로 변환하는 과정이다빌드 란?소스 코드를 실행 가능한 소프트웨어로 만드는 과정이다(ex jar, war...)링크 란?최종 실행 가능한 파일을 만들기 위해 컴파일한 결과물들에 있는 여러 개로 분리된 소스 코드들에서 필요한 부분을 찾아서 연결해주는 작업이다자바의 빌드 도구들Maven-프로젝트에 필요한 모든 Dependency를 리스트 형태로 Maven에게 알려주어 종속성을 관리한다-XML, Rep.......

Controller와 Service의 차이 [내부링크]

컨트롤러같은 웹 계층이 없어도 어플리케이션이 동작해야 한다웹계층 없이 동작하는 어플리케이션을 만들어야 할때 서비스로직을 재사용해서 만들수 있으면 좋다Controller에는 웹 계층 처리를 위한 코드(폼 데이터 처리, 화면에 뿌릴 데이터 넘겨주기)Service에서는 서비스 비지니스 로직나도 컨트롤러와 서비스의 로직 구분을 명확히 하도록 노력해야겠다

Spring Boot - 장바구니에 담긴 물품 골라서 주문신청, 주문취소(Thymeleaf + JdbcTemplate) [내부링크]

Controller와 Service의 구분을 명확히 하기위해Controller에는 데이터의 이동 위주 Service에는 비지니스 로직 위주로 했다[OrderController][OrderService][OrderRepository]

[Silicon Valley 프로젝트] 입욕제, 천연비누 구독 사이트(쇼핑몰) [내부링크]

해외교육 기간동안 프로젝트를 하나 진행해야해서 나까지 합쳐서 총 5명인 팀원들과 함께 어떤 프로젝트를 할지 고민을 했고그 결과 입욕제, 천연비누 구독, 쇼핑 사이트를 만들기로 하였습니다.팀원중에 웹 개발 경험이 있는 사람은 두명이였습니다. 저는 백엔드 경험이 있고 나머지 한명은 프론트 조금 해봤다고 하였습니다.프론트는 Html + Css + Js로 개발을 하였고백엔드는 Spring Boot + Thymeleaf + JdbcTemplate 으로 개발을 진행하였습니다.저는 모든 백엔드 로직 + DB설계 + Thymeleaf를 이용한 데이터 뿌리기 + 쇼핑몰 프론트 작업을 하였습니다블로그에 올릴 때 소리가 없어서 허전한것 같기도 하고 보.......

Spring Boot - session.getAttribute String변환 오류 해결 [내부링크]

세션이 있을때랑 없을때가 있다get.sessionAttribute()는 Object형이며 값이 없을 경우 null이 온다세션이 존재할때 (String)으로 형변환을 해주면 오류가 뜬다.세션이 null값일때 toString으로 형변환을 해주면 오류가뜬다.그래서 서로 다른 경우가 존재하기때문에 try catch문으로 Exception을 잡아줬다

Spring Boot - Thymeleaf 타임리프 이미지 경로 오류 해결 [내부링크]

타임리프에서 img를 나오게 하려고 해도 URL에 변수를 넣기가 힘들었다@{} 이게 URL표현인데이 안에다가 ${} 이걸 넣어야하는데 자꾸 이미지 엑박이 뜨고 경로가 잘못되었다고 나왔다결국 해결했다!!이렇게@{} + ${} 해주면 된다무조건 @{}안에 들어가야한다고 생각했는데 아니였다!!( + 부분이 빨간색으로 밑줄되어있는데 상관없다)아주 행복하다!!!!

Spring Boot - 에러페이지 Exception(이런 방법도 있긴 있음) [내부링크]

물론 @ControllerAdvice, @ExceptionHandler와 같은 방법이 있겠지만그냥 어떤 에러가 난다면 그 모든 에러를 한번에 이렇게 처리해줄수도 있다

Spring Boot - 아이디 중복체크 로직 Service에서 구현하고 Controller에서 처리 [내부링크]

이렇게 Service에서 회원가입시 클라이언트에서 입력된 아이디와 DB의테이블의 회원아이디를 비교해주고 null값이 아닌경우 exception을 터트려준다DB에서도 유니크 값으로 설정해주고 서비스에서 로직을 구현해서 중복오류 해결그 Exception을 컨트롤러에서 받아서 처리할수 있다해외교육 프로젝트가 끝나고빨리 Rest API를 공부하고 API형식으로 터트려주고싶다!

Spring Boot - 카테고리와 상품 Repository, oracle sql 조건 실행순서(최근에 insert한 pk하나만 뽑기) [내부링크]

최근 insert된 값을 한개만 뽑고싶은데 이렇게 했더니 계속 제일 작은 시퀀스값만 나왔다.알고보니 oracle sql의 실행 조건 순서는1. FROM, WHERE 절 2. ROWNUM 조건 3. SELECT COLUMN LIST절 4. GROUP BY 5. HAVING 6. ORDER BY이다 그래서이렇게 실행시켜야지 올바르게 나온다테스트 값이 잘 나온다

Java01 자바의시작 [내부링크]

[JDK설치]이제 컴퓨터의 어떤경로에서도 자바를 접근할수 있도록 환경변수를 설정해 주어야하...

Java01 자바의시작2 [내부링크]

public은 대소문자를 가립니다.public 클래스는 파일명과 클래스명이 일치해야합니다 public class Hell...

Java01 변수,자료형 [내부링크]

[변수]값을 저장할 수 있는 메모리 공간(메모리 영역에 값을 기록하고 읽기 위해 번지 대신 붙인 이름)ex...

Java01 자료형,입력 [내부링크]

[문자열]char -> 한 문자만 입력가능'이범준' -> 입력불가문자열 : 복수의 문...

Java01 연산자 [내부링크]

[연산자]단항 연산자 : 피연산자가 1개 ex) int y = (-)x; 2항 연산자 : 피연산자가 2개 ex) int...

Java01 연산자2, 명령문(if문) [내부링크]

[연산자][실습][명령문]-순차 : 위에서 아래로 차레차례 일을 수행-조건 : 제시된 조...

Java01 명령문2(switch문, while문) [내부링크]

[실습][실습][switch 문]ex)switch ( 변수 ) { case 값 :코드break;case 값 :코드break;d...

Java01 명령문3(do while문, for문) [내부링크]

[실습][실습][실습][실습][do while문]- do 문장 수행 후 조건 채크-그외 w...

Java01 명령문4(루프빠져나오기,중첩반복문) [내부링크]

[실습][실습][중첩반복문]while ( 조건 ) { 참이면 코드 블록 ...

Java01 반복문실습 , 배열 [내부링크]

[실습][실습][실습][실습][배열]자료형 변수명 [] = new 자료형[ 배...

Java01 달력만들기(심화 실습) [내부링크]

[달력 출력하기]문제를 다음의 단계로 나누어 해결하기1. 1년부터 2016년까지의 일수의 합 구해보...

Java01 배열2 [내부링크]

[실습][실습][향상된 for문]배열을 이용한 for 문이라면 이렇게 줄여 쓸수있다...

Java01 배열,2차배열실습 [내부링크]

[실습][실습][실습][실습][실습][실습][실습][실습]...

Java01 메서드 [내부링크]

[메서드]반환값의 타입 메서드 이름 ( 타입 변수명, 타입 변수명, ....) { 기능을 구현하는 코드} ex)i...

Java01 메서드2 ,메서드를 이용해 연봉 프로그램 다시 프로그래밍하기 [내부링크]

[변수의 Scope ]- 변수가 유효한 영역 : Scope - 변수는 선언된 중괄호 영역에서만 유효하다. - 변수...

Java01 클래스(클래스,생성자) [내부링크]

[객체지향의 특성]추상화 :클래스 정의하기캡슐화(정보은닉) : 클래스에서 정보를 감출 수 있는 방법 제...

Java01 클래스2(캡슐화,getter/setter) [내부링크]

[클래스 변수(static)]- 변수 선언 앞에 static 지시자 추가- 모든 객체에 공유되는 변수- 값을 변경하면 ...

Java01 클래스3(getter/setter 2) [내부링크]

getter / setter 는 앞에변수를 private로 설정해주고 함부로 못바꾸게 해준다.내가 설정한 경로로만...

Java01 클래스4(상속) [내부링크]

[상속]Inheritance (상속) 측면 기존에 개발된 클래스에 추가 기능을 더하여 새로운 클래스를 작성 소프...

Java02 클래스5(다형성) [내부링크]

[상속 실습][super]부모 클래스의 생성자 호출 – super 키워드 이용super -> 자신의 부모 클래스를 ...

Java02 클래스6 , 추상클래스 [내부링크]

[실습]-Employee 클래스에 bonusPay 추가- 계약을 위한 dummy – Method-- HourlyEmployee 클래스에...

Java02 클래스7 , 인터페이스 , 애너테이션 [내부링크]

[실습]Employee class에 추가된 추상 메서드 print 구현 Employee의 print 추상 메서드 주석 해제 prin...

Java02 중첩클래스, 중첩인터페이스 [내부링크]

[중첩클래스]클래스 안에 클래스를 선언한다[정적 멤버 클래스]static 으로 선언된 멤버 클래스Car의 객...

Java02 익명클래스, 열겨형, 모듈, Object클래스(hashCode, toString) [내부링크]

[익명클래스]인터페이스로 객체를 생성ex)new 인터페이스명 ( ) { 구현 부}  ; 별도의 클래스로 선언하기...

Java02 Object클래스2 (toString, equals, clone) [내부링크]

toString 메서드를 오버라이드 해주었다[실습]toString() 메서드 오버라이딩 하기 Salari...

Java02 예외처리(Exception) ,try catch문 ,throw, assert [내부링크]

예외 : 더는 프로그램을 진행할 수 없다 (내팽개쳐진 상태)[try catch문]예외가 발생할 수 있는 곳...

Java02 예외2, 유용한 클래스들(Objects,Comparable,Comparator,System,Array) [내부링크]

[실습]ConsoleInput 소스 코드 이해하기 attemptNum : 사용자에게 다시 물어볼 횟수 (getAttemptNum...

Java02 유용한 클래스들(String,StringBuffer,Arrays,Wrapper,Integer) [내부링크]

[String][StringBuffer][실습]ConsoleInput.getString(String msg, String[...

Java02 유용한 클래스들(Math,Random,Locale,Date,Calendar,Formatter,format) [내부링크]

[실습][MATH][RANDOM]임의의 수 생성-주사위 던지기-과학 시물레...

Java02 유용한 클래스들(Format,java.time패키지) ,데이터메니저(DataManger) [내부링크]

[실습][Format]SimpleDataFormat-날짜/시간을 원하는 형식으로 표현 -Default Locale...

Java02 제너릭(Generics) [내부링크]

앞에서 다뤘던 DataManager에는 문제점이있다모든타입이 저장가능해서 데이터를 꺼낼때 그 데이터가 무슨...

Java02 컬렉션(ArrayList,LinkedList) [내부링크]

[ArrayList]ArrayList와 LinkedList는 비슷하지만ArrayList는 배열을 이용하고 Linked...

Java02 컬랙션2(LinkedList 실습,HashSet, TreeSet, HashMap, Properties) [내부링크]

[실습]자연수를 이진수를 나타내는 배열로 변환하는 메서드 구현예: 2={ 1, 0}  3={ 1, 1}  19 &#x...

Java02 I/O 스트림(FileStream,File(Writer/Reader) Filter(DataStream,PrintStream, PrintWriter, Scanner) [내부링크]

[I/O 스트림(Stream)]다양한 입출력을 통일된 방법으로 다루기 위한 개념 java.io 패키지 [java.base ...

Java02 연봉프로그램 소스에 제너릭 컬렉션 추가하기 [내부링크]

[실습]ArrayList를 이용해서 기존 배열을 삭제후 새롭게 코드를 바꾸었다.

Java02 I/O 스트림2 (Buffered(Input/Output)Stream, File, Object(Input/Output)Stream),파일 입력받아 문장단어 바꾸기 [내부링크]

[BufferedInputStream / BufferedOutputStream]내부 버퍼를 이용 성능 향상 추가적인 메서드는...

Java02 Thread [내부링크]

[Thread]쓰레드 : 프로그램을 수행하는 흐름 모든 프로세스에는 최소 1개의 쓰레드 존재 main 쓰레드 : ma...

Java02 Thread2 [내부링크]

[실습][wait / notify – 쓰레드의 실행 제어]두 쓰레드가 동시에 접근하는 Mineral.mi...

Java02 GUI [내부링크]

[Event Driven Programming]지금까지의 프로그램 -> 시작과 끝을 프로그래머가 지정. [ main...

MVC 모델 java로 구현 [내부링크]

MVC란 Model View Controller의 약자로 에플리케이션을 세가지의 역할로 구분한 개발 방법론이다. ...

Java03 (JDBC 사용) [내부링크]

JDBC (Java DataBase Connectivity) 사용0) 라이브러리(jar) 추가:1) 이클립스 프로젝트 폴더...

Java03 Java랑 Oracle 연동해서 SELECT UPDATE DELETE [내부링크]

SELECT : executeQuery();UPDATE, DELETE : executeUpdate()...

Java03 MCV모델 Oracle JDBC연동 [내부링크]

(View 역할 : 사용자 입출력)(Controller 의 Interface) + 쿼리문(JDBC)...

Java03 SQL문 연습 SELECT [내부링크]

SELECT [컬럼명 또는 표현식] FROM [테이블, 뷰] WHERE [조건절]

Java03 SQL 단일행 함수1(SingleRow Function) [내부링크]

[INITCAP 함수]첫글자만 대문자로 출력하고 나머지는 전부 소문자로 출력하는 함수문법: INITC...

Java03 SQL 단일행 함수2(SingleRow Function) [내부링크]

[SUBSTR 함수]구문: SUBSTR( ‘문자열’ 또는 컬럼명, 시작위치, 추출할 글자수 )문자열에서 ...

스택(Stack), 큐(Queue), 원형큐 [내부링크]

[스택(Stack)]스택이란?한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out) 형식의 ...

[HTML] CSS, Link, Img, Table [내부링크]

[CSS : Cascading Style Sheets]HTML elements 들이 화면상에 어떻게 표시될지 기술함.[적용...

[HTML] List, Display, id, class, name, Form1 [내부링크]

<ul> Unordered List<ol> Ordered Liststyle 적용시 '어느 element' 에 '...

[코리아IT 프로젝트] 영화예매 프로그램 (MVC + JDBC + SWING) [내부링크]

데이터베이스 설계, 연동 및 JAVA MVC 모델 구현 실습을 하기위해팀원 2명과 함께 프로젝트를 실시...

[HTML] CSS(BoxModel, WidthHeight, Icon, Position, Selector) [내부링크]

[Box Model]모든 HTML elements 들은 사각형 상자 모양으로 구성된다.CSS에서 말하는 box model ...

[HTML] CSS(Animation), JavaScript(Output) [내부링크]

[Animation]transform : 관련 값translate() <-- 위치 이동rotate() <-- 회전값scale() <-- 크기...

Java03 SQL 그룹 함수(Aggregate Function) [내부링크]

<SELECT 쿼리문 순서> SELECT FROM WHERE GROUP BY HAVING OR...

[HTML] JavaScript(DataType) [내부링크]

[JS의 자료형(data type)]numberstringbooleanarrayobjectfunctionundefinedJS의 자료형(타입) 은 가...

순환(재귀함수, 합, 팩토리얼, 제곱수, 피보나치, 최대공약수(뉴클리드 호제)값 구하기 [내부링크]

[Recursion Function]순환, 재귀함수- 하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 방식으로 ...

순환(이진검색- Binary Search) [내부링크]

[Binary Seach]시간복잡도 : log2Nex) 순차탐색 : N/2이진탐색은 자료를 반으로 계속 쪼개면서 검색...

순환(재귀함수를 이용한 미로찾기) [내부링크]

권오흠 알고리즘강사님 강의를 보면서 나도 미로를 구현해보았다.재귀함수를 공부하지만 이번거는 생각...

기계학습 소개 [내부링크]

기계학습이란?-데이터를 이용해서 명시적으로 정의되지 않은 패턴을 컴퓨터로 학습하여 결과를 만들어내는 ...

기계학습과 수학 [내부링크]

선형대수 : 벡터와 행렬, 선형결합과 벡터공간, 역행렬벡터 : 샘플을 특징 벡터로 표현ex) Iris 데이터...

기계학습의 주요 개념 [내부링크]

머신 러닝의 4가지 핵심 개념-모델 : 데이터를 바라보는 시점과 가정-손실함수:모델의 수식화된 학습목표-...

코딩테스트 연습-완주하지 못한 선수 [내부링크]

https://programmers.co.kr/ 프로그래머스라는 사이트에서 혼자 공부하는 내용문제 설명수많은 마라톤 선...

코딩테스트 연습 - 전화번호 목록 [내부링크]

문제 설명전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다...

기계학습 - 분류문제 [내부링크]

분류 - 회귀만큼이나 기본적인 머신러닝문제분류방법-의사 결정 트리-KNN-나이브 베이지안 분류기...

코딩테스트 연습 - 위장 [내부링크]

문제 설명스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.예를 들어 스파이가 가진 옷이 아...

기계학습 - 군집화 [내부링크]

군집화-샘플은 부류 정보가 없다-비지도 학습-군집이 몇 개인지 모르는 경우도 많다-군집화를 부류 발견 작...

JSP - 간단한 설명과 맵핑(어노테이션, web.xml) [내부링크]

작년에 웹프로그래밍을 배웠었다. 처음부터 다시 차근차근 공부하려고 한다.Http://www.jsplearn.co...

JSP - Servlet GET방식, POST방식 [내부링크]

[GET방식]-URL값으로 정보가 전송되어 보안에 약함[POST방식]-header를 이용해 ...

JSP - Servlet 라이프 사이클, Form, getParameter [내부링크]

[Servlet 라이프 사이클]1. Servlet 객체 생성 (최초한번)선처리 : @PostConstruct2. Init()호출 (최...

JSP - ServletConfig(서블릿 초기화 파라미터), ServletContext(데이터 공유), ServletContentListener(웹어플리케이션 감시) [내부링크]

[서블릿 초기화 파라미터(ServletConfig)]-특정 Servlet이 생설될때 초기에 필요한 데이터들이 있다(ex:...

JSP - jsp태그(지시자, 주석, 선언, 표현식, 스크립트릿, 액션태그) [내부링크]

[JSP태그]-Html코드에 JAVA언어를 삽입하여 동적문서를 만들기위해 사용지시자 : <%@ %> :...

JSP - Request, Response, 한글 인코딩 [내부링크]

[Request]웹브라우저를 통해 서버에 어떤 정보를 요청 하는것(request객체가 관리)getContextPath() :...

JSP - 액션태그(foward, include, param) [내부링크]

[액션태그](태그 끝에 / 는 꼭 붙여줘야한다)ex) <jsp:forward page="" />ex) <j...

Oracle DB 계정생성, 권한부여 [내부링크]

계정 생성CREATE USER 유저ID IDENTIFIED BY "비밀번호";계정삭제DR...

기계학습 - 신경망 학습1 [내부링크]

[신경망]-기계 학습 역사에서 가장 오래된 기계 학습 모델-신경망은 딥러닝의 기초[폰 노이만 컴퓨터]-...

운영체제 - 운영체제 (정의, 컴퓨터 시스템 동작원리, 부팅과정, 다중 프로그래밍, 진입점) [내부링크]

운영체제란컴퓨터 시스템이 보유하고 있는 자원들을 효율적으로 관리하고사용자에게 편의성을 제공하기 위...

운영체제 - 프로세스(문맥교환, 생성 및 종료, 스레드, 선점/비섬점 스케줄링) [내부링크]

프로세스 상태1. 준비(Ready) : CPU 할당을 기다리고 있는 상태2. 실행(Running) : CPU가 할당된 ...

운영체제 - 병행성(임계영역, 세마포어, 리눅스의 병행성, 뮤텍스, 스레드) [내부링크]

프로세스의 결정성동일한 입력에 대한 프로세스의 실행결과는 항상 일정하여야 한다즉 입력값이 같으면 결...

운영체제 - 교착상태(발생 조건, 해결책(예방, 회피, 탐지 및 회복)) [내부링크]

교착상태란?다중 프로그래밍 환경에서서로 다른 프로세스들이 상호간에 점유하고 있는 자원 사용을 요청하...

Oracle Database(JDBC) Connection만들기(데이터베이스 jdbc 연결) [내부링크]

이클립스를 실행시키고 Data Source Explorer을 추가해주고Database Connections에서 New를 눌러 새...

[오류] The Network Adapter could not establish the connection 오류해결 [내부링크]

저도 이것때매 오류가 떠서 해결한 적이 있는데혹시나 윈도우 서비스에서 오라클 리스너가 실행중인지 아...

운영체제 - 기억장치 관리(고정 분할, 가변 분할, 페이징, 세그먼테이션) [내부링크]

메모리 관리 정책 및 기법 결정시 고려사항-다중 프로그래밍 정도-메모리 공간의 분할 방법-메모리 할당의 ...

운영체제 - 가상메모리(반입정책, 교체정책, 할당정책) [내부링크]

가상메모리보조기억장치를 이용하여 사용자에게 가상의 연속적인 메모리 공간을 지원-> 실제 메모리보다...

JSP - Cookie(쿠키생성, 쿠키삭제, 쿠키확인) [내부링크]

쿠키 서버에서 생성되고 클라이언트에 전송되어 저장된다(용량 : 4kb, 300개까지 데이터 정보를 가질수 있...

JSP - Cookie를 이용한 간단한 로그인폼 만들어보기 [내부링크]

[login.html][loginOk.jsp][mainPage.jsp][logout.jsp][cookieTest.jsp]쿠키는 4kb의 물리...

JSP - Session(세션 설명, 세션의 메서드들 확인해보기) [내부링크]

세션세션도 쿠키와 같은 서버와의 관계를 유지하기 위한 수단이지만쿠키와 다르게 서버상의 객체로 존재 서...

JSP - session을 이용한 간단한 로그인폼 만들어보기 [내부링크]

[login.html][loginOk.jsp][mainPage.jsp][logout.jsp]

JSP - 예외페이지(page지시자, web.xml) [내부링크]

page지시자를 이용한 에러처리web.xml을 이용한 에러처리

JSP - 자바 빈(useBean, setProperty, getProperty) [내부링크]

자바 빈반복적인 작업을 효율적으로 하기위해 사용데이터 객체를 만들기 위한 클래스를 만드는 것...

JSP - 데이터베이스(JDBC연결, 데이터 출력, classNotFoundException) [내부링크]

데이터베이스 연결하기 전 설정(classNotFoundException오류 뜨면 밑에 해결방법 있음)데이터베...

JSP - DTO, DAO(Data Transfer Object , Data Access Object) [내부링크]

DAO데이터베이스에 접속해서 데이터 추가, 삭제, 수정 등의 작업을 하는 클래스유지보수 및 코드의 모듈...

JSP - PreparedStatement을 사용하여 Insert(DAO, DTO) [내부링크]

PreparedStatement객체Statement객체를 이용하면 중복코드가 많아지는 단점이 있는데 이러한 단점을 보...

JSP - 커넥션 풀(Connection Pool) [내부링크]

커넥션 풀(DBCP)클라이언트에서 다수의 요청이 발생할 경우 데이터베이스에 부하가 생긴다이런문제를 ...

SQL Update문이 계속 무한로딩상태에 걸릴때 [내부링크]

회원가입과 회원수정 로그인을 구현하는 도중 데이터 업데이트시 무한로딩상태에 걸려서 고민 엄청하고 해...

JSP - 로그인, 로그아웃, 회원가입, 수정, 탈퇴, 유저리스트(JSP + HTML + JS + JDBC) [내부링크]

지금까지 배우고 복습한 내용으로 jsp를 이용해서 로그아웃, 회원가입, 회원수정, 회원정보, 회원탈퇴, 유...

2020 Silicon Valley Software Innovation & Technology Program - 1주차1 [내부링크]

학교에서 뽑혀서 방학동안 7월 20일부터 8월 14일까지 4주간 "2020 SJSU SVSITP 프로그램&q...

2020 Silicon Valley Software Innovation & Technology Program - 1주차2 [내부링크]

오늘은 Design Thinking과 어제에 이어서 SV Innovation에 대해 강의를 들었다. 어제 해준 과제를 발...

Android - setText, Intent, ImageView & Toast [내부링크]

[Intent를 이용해서 Main창의 값을 Sub로 전달][화면에 내가 원하는 특정 이미지 ...

2020 Silicon Valley Software Innovation & Technology Program - 1주차3 [내부링크]

오늘은 3일차 수업을 들었다. 첫번째 시간에는 Silicon Valley Software Industry Practices 라는 과...

[Spring 오류] MVC 프로젝트 실행시 404오류 [내부링크]

Spring MVC모델을 실행시킨 후 JSP공부할 때 하던것 처럼 home.jsp에서 실행을 시켰는데 404에러가 ...

Spring - XML Setter를 이용한 DI(Dependency Injection) [내부링크]

[Spring특징이 적용되지 않은것]MyCalculator는 Calculator에 의존하고MainClass는 MyCalculat...

[Spring 오류] "Update dynamic Java sources working sets". "Loading DOM for JAX-WS Web Services". [내부링크]

이러한 오류가 떠서 고생했는데 eclipse 폴더의 eclipse.ini의 파일을 편집하면된다.eclipse.ini의 파일 ...

[Spring 오류] CGLIB is required to process @Configuration classes [내부링크]

위 코드를 프로젝트의 pom.xml에 기입해 줘야 해결된다.

Spring - Java Config를 이용한 DI(Dependency Injection), Bean 생명주기 [내부링크]

[Java 어노테이션 사용][Bean의 생명주기 인터페이스 사용]InitializingBean을 implements하면...

2020 Silicon Valley Software Innovation & Technology Program - 1주차4 [내부링크]

오늘은 Mobile Application Develope과 product Commercialization Plan에 대해 배웠다. 안드로이드의...

Spring Boot - 정적, 템블릿, MVC, API 이해 [내부링크]

이클립스가 아닌 Intellij로 개발 연습Spring보다 Spring Boot가 최신기술이여서 Spring Boot공부...

Spring Boot - 웹 어플리케이션 구조 [내부링크]

컨트롤러 : MVC의 컨트롤러서비스 : 핵심 서비스 로직 구현(중복 가입불가능 등등)리포지토리 : 데이터...

Spring Boot - H2DB연동, JPA사용, Spring데이터 JPA사용, AOP [내부링크]

[JPA 사용][Spring data JPA사용][AOP]AOP를 사용하지 않으면 ...

2020 Silicon Valley Software Innovation & Technology Program - 1주차5 [내부링크]

오늘은 Mobile Application을 마저 배우고 그다음시간에는 멘토들하고 프로젝트에 대해 상의했다. 우리가...

2020 Silicon Valley Software Innovation & Technology Program - 2주차1 [내부링크]

오늘은 먼저 Go-To-Market-Strategy에 대해 배웠다. 기억에 남는 제일 중요했던 내용들은 When you ar...

[오류] Referential integrity constraint violation: [내부링크]

DB에 게시판을 추가시키고 외래키도 추가한다음에 기존의 회원가입을 "naver"라는 아이디로 하...

2020 Silicon Valley Software Innovation & Technology Program - 2주차2 [내부링크]

오늘은 Go-TO-Market을 마저 다 배웠다. 그리고 자신이 생각한 상품을 프리젠테이션 하는 시간도 가졌...

2020 Silicon Valley Software Innovation & Technology Program - 2주차3 [내부링크]

오늘은 첫번째 시간에 머신러닝에 대해 배웠다. 이미 학교에서 배운내용이라서 잘 알아들으면서 수업을 들...

2020 Silicon Valley Software Innovation & Technology Program - 2주차4 [내부링크]

오늘은 devops를 첫교시에 배웠고 두번째 시간에는 머신러닝을 마저 배웠다. jupyter notebook을 설치해서 ...

2020 Silicon Valley Software Innovation & Technology Program - 2주차5 [내부링크]

오늘은 첫번째 시간에 Devops에 대해 마저배웠다. Katacoda라는 사이트에 들어가서 각종 시뮬레이션을 진...

[Silicon Valley 프로젝트] 웹 페이지 설계도(흐름도) 작성하기(구독사이트 + 쇼핑) [내부링크]

나는 이번 실리콘벨리 SJSU 프로젝트에서 아무 주제를 정해서 토의한 후 원하는걸로 개발하라고 했다....

Spring Boot - 페이징처리 기능 추가 Pagination [내부링크]

[Pagination.java][Pagination 객체 생성하면 저절로 생성되는 생성자][BoardController][B...

[오류] 공통 사용자 또는 롤 이름이 부적합합니다.(사용자 생성시) [내부링크]

Top-N쿼리때문에 오라클 11g에서 12g로 넘어왔다. 근데 사용자를 생성하려하니까 공통 사용자 또는 롤 이...

Spring Boot - SpringBoot + Oracle 12c 연동(Gradle) [내부링크]

오라클 12c를 사용하고 있다. 오라클12c랑 Spring Boot 연동[application.properties 추가][buil...

2020 Silicon Valley Software Innovation & Technology Program - 3주차1 [내부링크]

어제는 Business English에 대해 첫번째 시간에 배웠다. My resume should be personalized for every a...

Spring Boot - 파일 업로드 경로를 찾을수 없음, 이미지 파일 엑박, 정적 리소스 접근하기 [내부링크]

파일 업로드 경로를 지정해줄때 내 프로젝트 안에있는 경로로 설정이 되는게 아니라 ....\AppDat...

2020 Silicon Valley Software Innovation & Technology Program - 3주차2 [내부링크]

먼저 처음시간에는 software Startup Financial Planning에 대해 배웠다. 나는 개발자인데 먼가 경엉쪽 ...

Spring Boot - Lombok 사용 [내부링크]

getter, setter 동작 확인참고로 market에서 lombok install 해야한다

2020 Silicon Valley Software Innovation & Technology Program - 3주차3 [내부링크]

오늘 첫번째 시간에는 IOT 임베디드 시스템에 대해 배웠다. 이 과목은 내가 2학년때 학교에서 배운적이...

2020 Silicon Valley Software Innovation & Technology Program - 3주차4 [내부링크]

오늘 첫번째 시간에는 빅데이터 분석을 배웠다. 파이썬으로 가르키는데 git에 대해서도 알려주고 그랬다. ...

2020 Silicon Valley Software Innovation & Technology Program - 3주차5 [내부링크]

오늘 첫번째 시간에는 빅데이터에 대해 마저 배웠다. 그리고 두번째 시간에는 중간 발표를 했다. 우리 팀원...

Spring Boot - @Valid 사용법, 어노테이션 무작동 해결 Gradle [내부링크]

진짜 @Valid로 유효성검사해주는데 암걸려 죽을뻔했다ㅜsession변환과 같이 힘들었었다..진짜 dependenc...

Spring Boot - Spring Security를 이용한 사용자 pw 암호화 [내부링크]

먼저 Gradle에 security dependency추가나는 기존 security가 제공하는 로그인같은건 쓰지 않을거라서...

Spring Boot - 조회수가 2씩 증가 해결 [내부링크]

쿼리문도 정확하고직접 DB에서도 쿼리문 적어서 날려도 1씩 증가하는데게시물에 처음 들어가면 1증가하...

Spring Boot - Thymeleaf 변수 Javascript에 선언하기 [내부링크]

var 변수명 = [[${ 변수명} ]];이렇게 해주면 된다

2020 Silicon Valley Software Innovation & Technology Program - 4주차 [내부링크]

4주차에는 프로젝트에 관한 질문들과 아이디어 정리, 시장가치, 마케팅, 지금 시장에 내놓았을 때 어떨지 ...

2020 Silicon Valley Software Innovation & Technology Program - 4주차 최종발표날 [내부링크]

다들 준비한 프로젝트를 발표했다. 우리는 우리만의 아이디어인 입욕제 천연비누 구독사이트에 쇼핑기능 까...