![[Java, 자바] 추상 클래스(Abstract Class)와 인터페이스(Interface)는 언제 사용해야 될까?](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbpqjmQ%2FbtsH5fPaFNm%2FAAAAAAAAAAAAAAAAAAAAAOq4wjrt2l2xIRRpmE2cQVSTTksei2TDMlCKKn8tmkeI%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DXvaSJOKfXg2Fshj3vuf2lK635e4%253D)
추상 클래스와 인터페이스의 특징추상 클래스(Abstract Class)추상 클래스(Abstract Class)는 인터페이스와 유사합니다. 인터페이스와 마찬가지로 인스턴스화 할 수 없으며, 구현을 포함하거나 포함하지 않은 메서드 모두를 가질 수 있다.하지만 인터페이스와 비교하여 추상클래스가 가질 수 있는 중요한 특징 중 하나는 필드를 가질 수 있따는 점이다. 그리고 해당 필드는 static 또는 final이 아닐 수 있으며, public이나 prorected 또는 private으로 선언할 수도 있습니다. 인터페이스를 사용하면 모든 필드가 public, static, final로 처리되면 모든 메서드는 public입니다. 또한 단일 클래스만 extends 할 수 있는 반면, 인터페이스는 여러개를 구현할 수 ..
![[Spring, SpringBoot] Controller에서 데이터 받는 방법 (@RequestBody, @RequestParam, @ParthVariable)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2F2LNwJ%2FbtsH5L7Ret7%2FAAAAAAAAAAAAAAAAAAAAAJmdugCWRgWpah_9TFxyyQ2wpLInChlB_e38NnpkMMWC%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DeL1Z0Lh5965b9SXRW8%252F%252B06OYOnE%253D)
어느날 문득 정리하고 데이터 받는 방법에 대해 정리하고 싶어졌다 !서버에서는 요청한 데이터를 전달 받는 방법은 다양하다 ! MVC 패턴에서 주로 사용하는 어노테이션을 위주로 정리해 보려합니다 ! @RequestBody@RequestBody는 클라이언트가 보내는 HTTP 요청 본문(JSON, XML 등)을 HttpMessageConverter를 통해 타입에 맞는 자바 객체로 변환해줍니다 !@PostMapping("/test")@ResponseBody // return datapublic String test(@ReqeustBody data) { ...} @RequestParam@RequestParam은 클라이언트가 요청할 때 쿼리스트링을 통해 넘어오는 매개변수를 추출할 수 있습니다 !required가 t..
![[Java, Linux] Linux에 Java 17 설치하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fb0fruy%2FbtsH51P9Uam%2FAAAAAAAAAAAAAAAAAAAAAGFrsc-aTAZGivONXc7qLevqtxAjHUpnifjrEOMIYL1F%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DnmvxHFzYNniD706k3F7n04nliWc%253D)
설치환경- Linux : Ubuntu 22.04- JDK : openjdk-amd64 v17 설치하기① Ubuntu로 접속한 뒤 sudo 권한으로 apt를 업데이트한 이후 openjdk를 설치합니다.$ sudo apt update$ sudo apt install openjdk-17-jdk② 설치한 자바 버전을 확인합니다.$ java -version ③ 설치된 java 경로를 확인합니다.- default : /usr/lib/jvm/java-[버전]-openjdk-amd64/bin/java ④ environment 파일에서 JAVA_HOME 환경변수를 설정합니다.$ sudo vi /etc/entironment ⑤ source 명령어를 실행하고, 변경 값이 적용되었는지 확인합니다.$ source /etc/en..
![[Java, 자바] no main manifest attribute in 에러](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fbqw15K%2FbtsH6tMcZqf%2FAAAAAAAAAAAAAAAAAAAAAGhR5pWzgbb2QwSIMA0p22xziaLT4v3jeAQt0CqbThbF%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3D5p%252BX0%252Boz7agF8IVuKSr%252FDG0o%252BqI%253D)
에러Linux에서 jar파일 실행 시 no main mainfest attribute in 에러가 발생하였다 !찾아보니 JVM이 main메서드를 찾지 못해 발생하는 에러였다. 해결방법Spring Boot 2.5.0 이상 버전과 gradle을 사용 시 빌드할 경우 아래와 같이 jar파일이 2개 생성된다고합니다. 1. 앱이름.jar -> bootJar Task로 생성된 것2. 앱이름-plain.jar -> build Task로 생성된 것 첫 번째 jar파일은 해당 프로젝트에 필요한 모든 의존성이 같이 추가된 것으로 모두 정상적인 형태로 나오는 반면 plain.jar파일은 의존성을 제외하고 딱 프로젝트에 있는 자원들만 jar파일로 만든 것으로 spring 관련 의존성이 빠저 main메서드의 위치가 나오지 않습..
![[Java, 자바] static의 의미와 사용법](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fbfjf2u%2FbtsH6RF4ruI%2FAAAAAAAAAAAAAAAAAAAAAMrc2SLDfX3dFMhX6UW73J62ouR8_HySQGirzqKDVWND%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DFrFMbrblL670vEshrI5JssfugE0%253D)
Static이란 ?static은 정적이라는 뜻으로 '고정된'이란 의미를 가지고 있습니다. Static이라는 키워드를 사용하여 Static변수와 Stitic메서드를 만들 수 있는데 다른말로 정적필드와 정적 메소드라고도 하며 이 둘을 합쳐 정적 멤버라고 합니다.정적필드와 정적 메서드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다. 그렇기에 클래스 로더가 클래스를 로딩해서 메서드 메모리 영역에 적재할 때 클래스별로 관리됩니다. 따라서 클래스의 로딩이 끝나 즉시 바로 사용할 수 있습니다. 정적(Static) 멤버 생성Static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 Static영역에 할당됩니다. Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든..
![[Java, 자바] instanceof란 ?](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbzqXtO%2FbtsH52he60S%2FAAAAAAAAAAAAAAAAAAAAAO0rKHor02QGulkcIXEFMlDgjPCSrQSImBT_QMmq5Syf%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DrUi5YiJ4XC6nfobK%252FglAhpcv1AQ%253D)
instanceof란 ?instanceof는 객체 타입을 확인하는 연산자입니다 ! 형변환 가능 여부를 확인하여 true/false로 결과를 반환해줍니다. 주로 상속 관계에서 부모 객체인지 자식 객체인지 확인하는 데 사용됩니다 ! instanceof 사용방법instanceof의 기본 사용방법은 아래의 예시와 같이 "객체 instanceof 클래스"를 선언함으로써 사용할 수 있습니다.class Parent{}class Child extends Parent{}public class InstanceofTest { public static void main(String[] args){ Parent parent = new Parent(); Child child = new Child()..
![[Spring, Spring Boot] @Transactional의 중첩에 대하여](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FpJD62%2FbtsH5IJ4SQs%2FAAAAAAAAAAAAAAAAAAAAAFUSPWqjAz82LX2rN03MZlksl0VhTw-b_RZuQwLcIssw%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DvtcW%252F%252BDvCHU4fYBNrxBJEQL9wYg%253D)
트랜잭션의 개념은 여기를 클릭하여 확인해보세요 ! @Transactional이 중첩이 되었을 때업무 중 @Transactional이 중첩이 되었을 때(아래와 같은 상황) 어떻게 진행될지 궁금해졌다 !@Transactionalpublic Info buy(String item){ payment newPayment = new payment(item); return payment(newPayment)}@Transactionalpublic Info payment(Info info){ buyRepository.save(info); return info;}buy 메서드에서 payment 메서드를 호출하고 있는데, 두 메서드 모두 @Transactional 어노테이션이 적용되어 있는 상태입니다. 트랙잭션의..
![[Spring, Spring Boot] @Configuration이란 ?](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FtlPwG%2FbtsH5ZEPic8%2FAAAAAAAAAAAAAAAAAAAAACJpl4BX9V97_GQkzhg-aSdZgeXQceJvZ-gxwtE-HbRD%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DOV%252BjBvXcSiIx3IkL1Qh0E0ja3bk%253D)
@Configuration이란 ?Spring, Spring Boot에서 Bean을 수동으로 등록하기 위해서는, class 상단에 @Configuration 어노테이션을 적용해주고, @Bean을 사용해 수동으로 빈을 등록할 수 있습니다 !빈을 생성할 때 메서드의 이름으로 빈의 이름이 결정됩니다. 그러므로 중복된 빈의 이름이 존재하지 않도록 주의해줘야합니다 !@Configurationpublic class DatabaseConfig { @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); ..