목록Java (21)
가수면
프론트에서 파일을 다운받기 위해 백엔드로 요청 보낼 때 백엔드에서 구성해야할 로직을 정리한다.백엔드 (JAVA) public void downloadFile(HttpServletResponse response, String fileOriginNm, String policyFileNm, String policyFlpth) { String uploadPath = policyFileService.getPolicyUploadFile(policyFlpth, policyFileNm); // uplo..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/CBqss/btsGeAF337c/zCDqu4G7QKtakD4oA2GKz1/img.png)
S3 버킷 생성 1. 버킷 생성 버킷 생성 페이지에서 차례대로 작성한다. 퍼블릭 액세스 파트에 대해선 '모든 퍼블릭 액세스 차단'의 체크를 풀어준다. (필요에 따라 세부 설정) 이후 생성 2. 버킷 정책 설정 정책 설정을 하지 않으면 저장된 파일의 url 조회 시 조회가 안 된다. 버킷으로 들어가 '권한' → '버킷 정책'의 '편집' 버튼 클릭 버킷 ARN을 복사 후 정책 생성기를 클릭한다. Step1 'S3 Bucket Policy' 선택 Step2 Principal에 * 입력 Actions에 Get Object, Put Object 체크 ARN에 복사한 것 붙여넣기 생성 후 나온 것 복사해서 정책에 붙여넣기 만약 ' Action does not apply to any resource(s) in sta..
로깅 프레임워크를 사용한 방법@Slf4j 사용 long startTime = System.nanoTime(); // 측정하고자하는 실행 코드 long endTime = System.nanoTime(); double duration = (endTime - startTime) / 1_000_000_000.0; String formattedDuration = String.format("%.2f seconds", duration); log.info("처리 시간: {}", formattedDuration);Python import time start_time = time.perf_counter() // 측정하고자하..
spring boot security의 사용과 rest API 서버일 때를 기준으로 한 에러 핸들링 방법을 정리한다. 인증 spring boot security를 사용하는 경우 requestMatchers를 통해 인증이 필요하지 않은 url을 예외 처리할 수 있으며, 그 외 url에 대해 인증 절차를 통과하지 못했을 경우 exceptionHandling를 이용해 전역적인 인증 에러를 발생시킬 수 있다. @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http . . . .exceptionHandling((exceptionHandling) -> exceptionHandling.authenticationEnt..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/0BHhy/btsEWwTMLbu/ldpOJiIQ0azXHIrmSZ1JI0/img.png)
Junit5 Java 환경 테스트 프레임워크 https://junit.org/junit5/docs/current/user-guide/#writing-tests JUnit 5 User Guide Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo junit.org https://www.petrikainul..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/nRErh/btsDNImGDkv/mSlsFeuicJo5VBEIN2ebJ1/img.png)
외부 웹 서버 설정사이트에 접속할 때, 기본적으로 443 포트를 사용하게 되어 https://~~~.com에 에 접속하게 되면 자동으로 443 포트로 연결을 시도하게 된다. (8443같은 포트를 사용하면 주소 뒤에 포트를 적어줘야함)그렇기 때문에 일반적으로 https의 포트를 사용할 땐 443을 사용하게 되는데 리눅스와 같은 유닉스 기반 시스템에서는 1024 이하의 포트(관리자 또는 특권 포트)를 일반 사용자가 열 수 없기에 1024 이하의 포트를 사용하는 것이 권장되지 않는다 443을 사용이 권장되는데 권장되지 않는다니!? 이 문제를 외부 웹 서버(Nginx, Apache 등)를 사용해 해결할 수 있다.외부 웹 서버에서 443 포트로 HTTPS 트래픽을 수신하고, SSL/TLS 핸드셰이크를 처리한 다..
Spring Security는 Spring Security Filter Chain를 통해 모든 요청을 인터셉트하게 된다. 때문에 Spring Security Filter Chain을 프로젝트에 맞게 커스텀 설정해서 사용해야한다. 본 글에서는 jjwt를 이용해 JWT를 다루는 방법을 정리한다. Spring Security Filter 설정 Spring Security가 업데이트되면서 기존 WebSecurityConfigurerAdapter 클래스를 extends 하고 configure를 오버라이드하던 방식에서 SecurityFilterChain를 사용하는 방식으로 바뀜 @Configuration @RequiredArgsConstructor public class SecurityConfiguration { ..
API 정적 필터링 model에 응답으로 보내고 싶지 않은 필드를 필터링할 수 있음 // SomeBean // @JsonIgnoreProperties, @JsonIgnore 둘 다 정적 필터링 가능 @JsonIgnoreProperties({"field1", "field3"})// field1, field3를 필터링 public class SomeBean { private String field1; @JsonIgnore// field2를 필터링 private String field2; private String field3; // FilteringController @RestController public class FilteringController { @GetMapping("/filtering") pu..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/tJzHH/btsCTWd6pei/wy52hnaEus77ny36nA1wT1/img.png)
HATEOAS HATEOAS (Hypermedia as the Engine of Application State) RESTful 웹 서비스 디자인의 핵심 원칙 중 하나 클라이언트가 서버와 상호 작용할 때 필요한 모든 정보를 응답에 포함시켜야 한다는 것을 의미 사용자가 다음에 무엇을 할 수 있는지 알 수 있도록 응답 내에 관련 링크와 옵션을 제공한다. 예) 사용자 프로필을 반환할 때, 응답에 사용자 프로필을 수정하거나 삭제할 수 있는 링크도 포함 1. 의존성 설치 org.springframework.boot spring-boot-starter-hateoas 2. api에 다른 링크 포함 시키기 예시 응답 모양) 응답과 같은 모양을 HAL이라고 함 { "name": "Adam", "birthDate": "1..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/3wFKs/btsCxCPqMVx/8wFG22KsuGk7kIK11ozC8k/img.png)
springdoc openapi로 검색해 깃허브 페이지로 이동 https://github.com/springdoc/springdoc-openapi GitHub - springdoc/springdoc-openapi: Library for OpenAPI 3 with spring-boot Library for OpenAPI 3 with spring-boot. Contribute to springdoc/springdoc-openapi development by creating an account on GitHub. github.com springdoc-openapi-starter-webmvc-ui의 pom.xlm를 참고해 의존성 설치 이때 SNAPSHOT이 아닌 버전으로 하나 다운그레이드해서 사용하길 권장 or..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cegr9u/btsCjZj4Bwh/NhjD4evdf6bn5dvbPQVrKK/img.png)
정적 데이터 기준 GET 1-1. 베이스가 되는 클래스 생성 1-2. 필드로 사용될 변수들 지정 1-3. 필드 생성, 게터와 세터, toString 생성 일반적으로 entity를 만들 때 생성자를 명시적으로 생성하지 않더라도 컴파일러가 기본 생성자를 자동 생성해주지만, 만약 사용자 정의 생성자가 하나라도 존재한다면 아래처럼 기본 생성자를 명시적으로 적어줘야 한다. public Todo() {} JPA 구현체는 리플렉션(런타임 시점에 클래스의 정보를 조회하거나 수정할 수 있게 해주는 기능)을 사용하여 엔티티를 관리하게 된다, 이 과정에서 파라미터가 없는 기본 생성자를 호출하게 되는데, 만약 사용자 정의 생성자만 있고 기본 생성자가 없다면 JPA 구현체는 해당 엔티티의 인스턴스를 생성할 수 없게 된다. 2-..
람다 함수 bean이름 -> 조건식 예시) public void deleteById(int id) { Predicate
JSP 내 태그 활용도를 높이기 위해 사용되는 라이브러리. 서버 사이드 로직을 구현하는 데 사용되는 특수한 태그들을 제공한다. 설치 https://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/c/tld-summary.html JSTL core (TLDDoc Generated Documentation) import Retrieves an absolute or relative URL and exposes its contents to either the page, a String in 'var', or a Reader in 'varReader'. docs.oracle.com 버전 지정해줘야 함 jakarta.servlet.jsp.jstl jakarta.servlet.js..
StringBuffer 문자열을 그대로 return하면 효율이 안 좋기 때문에 StringBuffer 사용 @RequestMapping("say-hello-html") @ResponseBody public String sayHelloHtml() { StringBuffer sb = new StringBuffer(); sb.append(""); sb.append(""); sb.append(""); sb.append("StringBuffer 테스트"); sb.append(""); sb.append(""); return sb.toString(); } JSP StringBuffer를 이용해 HTML을 그리는 것 보다 더 효율적으로 코드를 작성할 수 있음 방식 jsp파일에 html을 그린 뒤 거기로 리디렉션 시킴 ..
-스테레오 어노테이션- @Component 대신 사용해 코드 명확성을 강화할 수 있음 @Service 클래스에 비즈니스 로직이 있음 @Controller 웹 컨트롤러일 경우 @Repository Bean이 데이터베이스와 통신해 데이터를 저장하거나 검색하거나 조작하는 경우 사용 @RestController REST API 컨트롤러일 경우 -기타 어노테이션- @Primary 중복된 Bean에 우선권 @Qualifier Primary보다도 우선권. 조건문처럼 사용하는 듯 @Lazy 사용될 때여야 초기화됨. 레이지 로딩같은 거 @Scope(~~프로토타입) Bean을 요청할 때마다 새로운 인스턴스 생성 @PostConstruct useEffect 역할 @PreDestroy useEffect의 클린업 역할 @Nam..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/k1rqB/btsBhYsluck/JGje8ZLDNHfBqnHjz0aA21/img.png)
H2 인메모리 데이터베이스 1. H2 콘솔 사용 설정 // application.properties spring.h2.console.enabled=true// H2 콘솔 사용 활성화 spring.datasource.url=jdbc:h2:mem:testdb// 고정된 url 생성 이후 http://localhost:8080/h2-console 접속 가능 JDBC URL에 콘솔에 있는 url을 입력한 뒤 연결 2-1. H2 테이블 생성 Spring Data JPA Starter를 활용할 때마다 가져올 schema.sql 만들기 sql에서는 큰 따옴표(")대신 작은 따옴표(')를 써야함 // src/main/resources/schema.sql create table course ( id bigint not ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TmXJK/btsBfy2kTCI/rlgsuPeqSJ3yCnKjKXqpQ0/img.png)
사용되는 의존성 Spring Web Spring MVC를 이용해 RESTful을 비롯한 웹 애플리케이션 구축 기본 임베디드 컨테이너로서 apach tomcat을 사용 Spring Boot DevTools 빠른 애플리케이션 시작을 위해 구성을 제공 (변경 사항 재시작 필요없이 자동 적용 등) Spring vs Spring Boot Spring이 가지는 문제 의존성 관리 번거로움 web.xml 설정 필요 스프링 환경의 여러 설정을 적절히 지정해줘야 함 로깅, 에러 핸들링, 모니터링 등 비기능적인 부분들을 수동으로 구현해야 함 프로젝트마다 이 작업들을 해줘야 해서 개발 시간이 오래 걸림 Spirng Boot를 사용하면 위 문제들을 신경쓸 필요 없이 비즈니스 로직에만 집중할 수 있음 즉, 프로덕션 환경에 배포할..
지연 초기화 일반적으로는 context가 실행되면 즉시 Spring Bean이 초기화됨 @Component class ClassB { private ClassA classA; public ClassB(ClassA classA) { System.out.println("초기화"); this.classA = classA; } public void doSomthig() { System.out.println("doSomthig"); } } @Configuration @ComponentScan public class LazyInitializationLauncherApplication { public static void main(String[] args) { try(var context = new Annotatio..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bINLZu/btsA7vJ9IQg/WdsMZp0XbMy1LTFg4rKkzk/img.png)
개념 Spring은 의존성 주입을 활용하여 객체의 생성과 의존성 관리를 자동화함으로써, 개발자가 객체 간의 결합도를 낮추고 유지 보수가 용이한 코드를 작성할 수 있게 해줌 1. Spring Container(= Spring context, Spring IOC Container) 스프링 Bean과 생명 주기를 관리 1-1) Bean Factory 기본 Spring Container 1-2) Application Context 엔터프라이즈 전용 기능을 제공하는 Spring Container 웹 애플리케이션을 구축하기 쉬움 국제화가 쉬움 Spring AOP, 스프링 측면 지향 프로그래밍과 통합하기 쉬움 2. Java Bean과 Spring Bean 각각 Java와 Spring에서 관리하는 객체 2-1) POJ..
Java 자료형 기본형 타입(Primitive Type) 참조형 타입(Reference Type) - 논리형 - boolean - 정수형 - byte short int long - 실수형 - float double - 문자형 - char array enumeration class interface 기본형 타입 byte - 주로 파일이나 네트워크 데이터 처리 short - 낮은 메모리를 요구하는 애플리케이션, 예를 들어 임베디드 시스템에서 사용 int (기본) - 가장 일반적으로 사용되는 정수 타입 long - 매우 큰 정수 값을 저장하는 데 사용 float - 더 작은 범위의 실수와 적절한 정밀도를 제공하며, 메모리 사용이 더 적음. 정밀도가 그렇게 중요하지 않은 경우에 적합 double (기본) - f..