이번 포스팅에서는 이미지 업로드 API를 만들어보고 해당 이미지를 외부 폴더, 즉 자신의 컴퓨터에다 저장해보도록 하겠다. 먼저 프로젝트를 생성해보자. 프로젝트 생성 application.yml 표시되어있는 부분들을 자세히 봐보자. DB이름에는 생성해준 데이터베이스 이름을 넣고, 비밀번호를 넣어주면 된다. file.dir 에는 자신이 원하는 부분에 폴더를 만들고 경로를 넣어주면 해당 경로에 이미지가 저장되는 것이다. 나는 데스크탑에 images 폴더를 생성하여 해당 경로를 적어주었다. 컨트롤러 우리는 form-data 방식으로 파일을 전송할 것이다. 그럼 한번 Postman으로 확인해보자. 우리가 만들어준 경로에 원하는 사진을 넣으면 된다. 이 때 KEY 이름을 @RequestParam에서 명시해준 이름과..
우리는 스프링부트로 프로젝트를 할 때 습관적으로 @Transactional 어노테이션을 적용하고 있다. 이 어노테이션을 왜 사용하는지, 언제 사용하는지 알고 사용하면 로직의 흐름을 좀 더 이해하기 수월할 것이다. 그럼 같이 알아보자. 보안 여기서 이야기 하는 보안은 안정성이라고 보면 된다. 어떤 프로젝트나 기능을 만들 때 가장 걱정하는 것이 보안일 것이다. 실제로 보안을 강화하기 위해 다양하게 지원하고 있다. HTTP에서 HTTPS, CSRF 문제, UDP와 TCP, Spring Security, 쿠키와 세션 대신 토큰을, 토큰을 더 강화하기 위한 Refresh 토큰 등등.. 지금 생각나는 것들만 적었지만 훨씬 더 많을 것이다. 트랜잭션도 보안 때문에 생겨난 것이라고 보면 된다. 데이터베이스를 신뢰할 수..
컴퍼넌트 스캔 컴퍼넌트 스캔이란 스프링에서 자동으로 의존성을 주입해주는 것을 말한다. 실제로는 자동이 아니라 @Component 어노테이션이 붙은, 혹은 확장 어노테이션을 붙이면 스프링 컨테이너에 자동으로 객체가 저장되어 연결하는 방식이다. 자세한 내용은 자동 의존관계 포스팅을 참고하자. 우리는 정형화된 패턴인 컨트롤러, 레파지토리, 서비스단에서 @Controller, @Service를 붙여준다. Spring Data Jpa JpaRepository를 상속받은 인터페이스에서 @Repository를 붙여주지 않아도 되는 이유는 @Repository 없어도 빈으로 등록된다. 하지만 컴퍼넌트 스캔 방식으로 동작하는 것이 아니다. 스프링 데이터에서 해당 인터페이스(JpaRepository를 상속한 인터페이스)를..
객체 지향은 인간 지향이다. 프로그래밍 언어의 발전사를 보면 개발자를 더욱 편하고 이롭게 하기 위한 과정임을 알 수 있다. 기계어에서 어셈블리어, C, C++, 자바로 발전해 온 과정이 기계가 아닌 인간을 배려하기 위한 과정이었던 것이다. 하지만 객체 지향 전까지는 인간이 기계를 이해하려고 노력해야 하는 것에서 벗어나지 못했다. 그래서 "왜 우리가 기계 종속적인 개발을 해야 하는가?"라는 의문점에서 "현실 세계처럼 프로그래밍할 수 없을까?" 라는 고민을 했고, 객체지향의 개념이 탄생하였다. 우리가 주변에서 볼 수 있는 모든 것은 사물이다. 눈으로 보여지는 것도 사물, 손으로 만져지는 것도 사물, 머릿속으로 어떤 것을 상상할 때도 사물을 떠올린다. 이 사물을 멋진말로 객체, 영어로는 Object라고 한다...
자바 프로그램의 개발과 구동 우리는 컴퓨터를 구동하기 위해서는 컴퓨터, 즉 하드웨어와 운영체제, 그리고 그 위에서 구동될 소프트웨어가 필요하다. 그리고 소프트웨어를 개발할 수 있는 개발 도구가 필요하다. 자바는 이러한 과정을 그대로 모방하고 있다. 현실세계 자바 월드 소프트웨어 개발 도구 JDK(Java Development Kit) 운영체제 JRE(Java Runtime Enviorment) 하드웨어(컴퓨터) JVM(Java Virtual Machine) 현실 세계에서 프로그램을 실행하려면 개발 도구로 프로그램을 개발하고, 운영체제를 통해 하드웨어에 구동시킨다. 자바 월드도 마찬가지다. JDK를 이용해 개발된 프로그램을 JRE를 통해서 JVM에서 구동된다. 다음으로 알아볼 것은 자바의 메모리 사용방식이..
API 서버를 실행하려고 인텔리제이를 돌려봤더니 아래와 같은 오류가 나타났다. alter table board drop foreign key FKsds8ox89wwf6aihinar49rmfy 2022-08-11 09:48:53.222 WARN 89952 --- [ main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL " alter table board drop foreign key FKsds8ox89wwf6aihinar49rmfy" via JDBC Statement org.hibernate.tool.schema.spi.CommandAcce..
Refresh Token이란 ? 사용자의 인증을 위한 토큰이 아닌 새로운 에세스 토큰을 생성하는 용도로 사용한다. 사용자의 인증은 access 토큰으로 하되, access 토큰의 만료시간이 끝나면 refresh 토큰으로 다시 access토큰을 생성해준다. 나는 여기서 궁금한 점이 3가지 있었다. 왜 만료시간을 정해둘까 ? refresh Token을 사용하는 이유는 뭘까 ? refresh Token도 만료시간이 있을텐데, 이 이슈는 어떻게 처리할까 ? 하나하나씩 알아보자. 토큰 만료시간을 정해두는 이유 이유는 간단하다. 토큰을 빼앗기면 사용자의 정보가 다 털리기 때문이다. 이 때 토큰의 만료시간을 정해두면 토큰을 빼앗아가도 만료시간이 다 되면 더 이상 토큰이 아닌 아무 의미가 없는 문자열이 되기 때문에 토..
디버깅이란 ? 말 그대로 디버깅하는 것이다. 우리가 개발을 할 때나 테스트 코드를 작성하고 실행해봤을 때, 의도하지 않은 결과가 나오거나 실패했을 때 비정상적인 연산(버그)를 찾아서 해결하는 과정을 말한다. 언제 디버깅을 할까 ? 앞서 말했지만, 테스트코드를 짰을 때 의도한 대로 동작하지 않을 때, 새로운 기술을 학습중인데 도대체 어떻게 흘러가는지 모를 때, 아니면 어떠한 버그가 있는데 이 버그가 어느 지점에서 무슨 값이 어떻게 들어가있길래 이런 문제가 발생하는지 잘 모를 때 등등, 즉 의도한대로 나오지 않거나 버그가 발생해서 해결해야할 때 뿐만 아니라 어떠한 기술의 동작과정을 알고싶을 때도 디버깅을 사용한다. 디버깅을 제대로 공부하기 전에는 로그를 이용해서 변수들을 하나하나 찍어본뒤 어떤 변수가 어떠한..
QueryDSL 문법들은 직관적이기 때문에 해석하기 쉬울 것이다. 그럼 한번 알아보자. 제목이 테스트인 게시글들 조회 쿼리 public List findByTitle_Querydsl() { return query .selectFrom(board) .where(board.title.eq("테스트")) .fetch(); } selectFrom : select와 from하는 엔티티가 같으면 selectFrom으로 합칠 수 있다. board.title.eq : 해석 그대로 게시글의 제목이 equals, 즉 테스트와 같다면 이다. fetch : 데이터가 없으면 빈 값을, 있다면 리스트 조회 제목으로 검색하는 쿼리 public List findByTitle_Querydsl(String title) { return ..
한번 QueryDSL을 어떻게 사용하는지와 기본적인 사용방법에 대해서 알아보자. 코드는 현재 만들고 있는 게시판 API에다가 추가할 예정이다. 코드는 깃허브에 있다. 환경설정 먼저 queryDSL의 버전을 나타내는 코드를 추가하자. buildscript { ext { queryDslVersion = "5.0.0" } } 그리고 플러그인에 아래코드를 추가하자. id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" dependencies에 아래코드를 추가하자. implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" implementation "com.querydsl:querydsl-apt:${queryDsl..
- Total
- Today
- Yesterday