seaqkswkr의 등록된 링크

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

[spring] cors가 무엇인가 , 서버입장에서 어떻게 해결하는가 총정리 [내부링크]

cors 에러문구 Access to XMLHttpRequest at '접근하려는 곳' from origin '브라우저를 사용하는 위치' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 다음과 같은 에러를 만나게 될 것이다. 사실 이 문장에 해결방법까지 있는데 ..! 우선 cors가 무엇인지 정리해보겠습니다. cors란 cors의 약자부터 보겠습니다. cross- origin- resource- sharing 입니다. 말이 어렵네요 쉽게 말해서 브라우저로 www.naver.com 를 사용중인데, 네이버에서 www.kakao.com 로 정보를 요청하는 것을 의미합니다. 조금더 자세히) 네이버 자료를 이용하다가 , 카카오 이미지가 필요해서 요청하는 부분이 있다고 칩시다. 카카오의이미지 즉, 카카오의 자원을 네이버가 사용하려고 하는데 네이버와

[spring] @Transactional 한번에 총정리(왜 쓰는가? 전파속성이란? 에러유형에 따른 rollback? inner method 호출 해결법) [내부링크]

우선 확인 방법부터 알고 들어가자 1)확인 어떻게 할건데?? 로그를 찍을거다 application.properties 에서 아래와 같이 설정하면 로그로 상게하게 볼 수 있어서 좋다 logging.level.org.hibernate.transaction:DEBUG logging.level.org.springframework.orm:TRACE 2) java 코드에서 transaction 범위인지 확인 가능한 방법이 있나? 필요한 코드부분에서 아래 한줄을 넣어주면 true/false 결과값을 알려준다. log.info("==== innerTest transaction Active : {}", TransactionSynchronizationManager.isActualTransactionActive()); @Transactional 왜 쓰는가 쓰는이유? 작업의 단위로 구별짓기 위해, commit실행을 위한 단위로 쓰고자 함 설명을 해보겠습니다. @Transactional을 우선 왜 쓰는지

InstantiationException 나면 [내부링크]

현재 리플렉션 쓰고 있는가? 추상클래스도 쓰고 있는가? --> 리플렉션으로 constructor만들때 추상클래스는 만들수 없으니 조심하면 된다.

[java] 한줄로 끝내는 string to enum [내부링크]

public enum MONTH { Jan, Feb, Mar, Apr ; } String jan="Jan" ---> MONTH .Jan 으로 바꾸고 싶다면 MONTH enumJan = (MONTH )Enum.Parse(typeof(MONTH ), jan="Jan") Enum.parse를 쓰면 된다

[java]Inteager to int , 만약 null이 있을때는 어떻게 바꾸는게 좋을까 [내부링크]

아마 intValue() 쓰면 nullPointer 에러를 맞게 될 것이다. 바로 해결 방법 Optional.ofNullable(integer).orElse(-1) 를 쓰시거나 int i = integer != null ? integer.intValue() : -1; 쓰면 됩니다. 결론은 NULL일 수 있어서 한번 체크해야 한다는 것!

[spring] @ColumnDefault, @Builder.Default [내부링크]

@ColumnDefault, @Builder.Default 두개다 초기화 해주는 건데 느낌이 다르다 @ColumnDefault 는 db에 날릴때 설정해준 값으로 같이 날리고, @Builder.Default 는 객체를 생성할때 설정해준 값으로 만들어진다.

[spring][application.properties] - include 된 application.properties 우선순위 [내부링크]

# spring.profiles.include 설정. # - include 된 profile 이 우선순위가 높음. ex) application.properties 파일 내용(spring.profiles.include=common) 1. application-common.properties 2. application.properties

[querydsl][spring] contains와 like 차이 [내부링크]

like(값) 을 쓰게 되면 값에 일치하는 것만 가지고 온다 , eq와 비슷 like("%값") like("값%") like("%값%") 상황에 맞게 써야 한다 contains(값) 값이 포함되어 있다면 가져온다. like("%값%") 비슷하다

[spring]Resetting read-only flag of JDBC Connection [내부링크]

스프링에서 이런오류 있으면 entity 변경시 @tranctional을 안쓰고 있나 확인해보세요

[DBeaver] sql 없이 버튼으로 컬럼에 NULL값 설정 방법 [내부링크]

컬럼 선택후 오른쪽 마우스 클릭 > edit > NULL로 설정 마지막에 save해주세요

[queryDSL][SqlException]You can't specify target table for update in FROM clause [내부링크]

원인 You can't specify target table for update in FROM clause 본인이 mysql를 쓰고 있는가? 서브쿼리 만들때 자기테이블은을 또 바라보고 있는가? mysql은 이런 서브쿼리를 지원하지 않는다. 에러가 났다. 간단하다 서브쿼리에 같은 테이블을 쓰지 말자 어차피 서브쿼리를 쓰면 성능이 실제로도 떨어진다. 해결방안 기존 코드 queryFactory .update(testEntity) .set(testEntity.testCheck, 1) .where(testEntity.id.in( JPAExpressions .select(testEntity.id) .from(testEntity) .where(testEntity.testCheck.ne(1)) .where(testEntity.typeType.eq(element.getType())) .orderBy(testEntity.id.asc()) .limit(element.getCount()))) .execu

[spring][gradle] sourceSet 무엇인가? 어떻게 사용하는가 ? [내부링크]

sourceSet 란? 보통을 build할때 ,다시말해 jar파일로 만들고자 할때 src/main/java 코드가 source의 원천이 된다. 다시 말해 아무런 설정을 하지 않으면default가 된다. sourceSet이란 source의 원천이 무엇인지를 말한다. sourceSet 어떻게 설정하나? 그냥 아무런 설정을 하지 않으면 굳이 코드에 적지 않아도 이런 설정이 들어가있다. sourceSets { main { java { srcDir 'src/main/java' } } } 이제 다른 파일을 쓰고 한다면 아래와 같이 추가할 수 있다 ==> srcDir querydslDir 만약에 배제시키고 싶다면 아래와 같이 추가할 수 있다. ==> exclude 'src/exclude' def querydslDir = "$buildDir/generated/querydsl" sourceSets { main { java { srcDir 'src/main/java' srcDir querydslDir

[spring][Querydsl] 총정리 projection, 이걸로 끝 - 사용이유, 4가지 방식 (bean, fields, constructor, @) [내부링크]

projection왜 쓰는거지? qeuryDSL에서 selet로 값을 뽑아내고 싶을때, entity말고 원하는 값만 뽑아내려고 ! 쓴다 참고) 원하는 값 뽑아내고 나서 서비스계층으로 반환할텐데 반환값이 튜플로도 가능하고 DTO도 반환이 가능하다 그 중에서 DTO를 활용해본다 projection 4가지 방법 1.bean 사용 - getter/setter를 이용해 필드에 접근 아래는 기본 코드이다. @Getter @Setter public class ProjectionDto { private int type; private Long count; } (select에 잘보면 일부러 testEntity.typeType, testEntity.typeType 중복되게 쓴거다... count를 사용해보려고,, 우선은 쭉 따라오기를 바란다..) import static com.querytest.testUnit.QTestEntity.testEntity; public List<?> search(List

[spring] test 코드에서 QueryDSL을 사용하기 위한 세팅 - 필요 annotation(@) , EntityManager, application.properties [내부링크]

<변경전 ; 테스트 하고자 하는 코드 > @SpringBootTest class ApiApplicationTests { @Test void contextLoads() { } } 여기에 @Transactional 추가 : 변경(수정 혹은 삭제)하고자 하는 값이 있다는 뜻 @ActiveProfiles({"test"}) 추가 : src/main/resource/application-test.yml 를 설정으로 보겠다 . (저는 갠익적으로 test용 DB를 사용해서 그렇습니다. 설정에 따라서 @ActiveProfiles안쓰셔도 무방합니다 !! src/main/resource 가서 application-test.yml을 추가했습니다) @Autowired EntityManager em; 추가 : 스프링 트랜잭션을 사용하고자 함 <변경후 ; 테스트 하고자 하는 코드 > @SpringBootTest @Transactional @ActiveProfiles({"test"}) class ApiAppli

[server][linux]curl post 로 json을 날린다 [내부링크]

사용방법 curl -d '{"key": "value",}' //json String -H "Content-Type: application/json" //json방식을 사용할것이라서 Content-Type을 명시 -X POST http://localhost:8080/login // POST method라고 명시하고 url을 같이 적는다 사용한 예 curl -d '{"id": "admin","passwd": "admin.123"}' -H "Content-Type: application/json" -X POST http://localhost:8080/login

[spring][java]enum을 활용한 java 객체 <-> json으로 변환해보기 (총정리로 한눈에 보기) [내부링크]

상황 <json> { "input_value" : 1 } <enum> TYPE1(1) , TYPE2(2), TYPE3(3) enum을 활용하여 객체로 가져오고자 을 한다면 enum 코드에서 모두 해결이 가능하다 json -------------------------> 자바객체 위와 같은 경우는 역직렬화, 또는 언 마셜링 이라고 하고 @JsonCreator 붙은 애노테이션을 활용하여 값을 반환해준다 자바객체 -------------------------> json 위와 같은 경우는 직렬화, 또는 마셜링 이라고 하고 @JsonValue 붙은 애노테이션을 활용하여 public enum EnumTest{ TYPE1(1), TYPE2(2), TYPE3(3) ; private final int value; EnumTest(int value) { this.value = value; } @JsonCreator public static EnumTest fromValue(int value) { for

[spring] spring data jpa ( findBy 통해 ) entity를 가져온후 특정 필드값을 자동으로 set하고 싶다면 [내부링크]

바로바로 @PostLoad를 쓰면된다 . 원하는 상황 : findBy를 통해 entity로 값을 가져오고 나서 (1차캐시에서 조회하고 없으면 디비에서 찾아서 가져올 것이다 : 영속성 획득 ) testField1 를 참고해 testField2를 만들고 싶다. (여기서 testField2는 DB와는 무관한 영속성하고 무관한 필드이다.) 아래는 TestEntity 를 작성해보았다. @Entity @Table(name = "test") @Getter @Setter @NoArgsConstructor public class TestEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String testField1; @Transient private String testField2; @PostLoad public void postLoad(){ this.testField2=getTestFi

MissingServletRequestPartException: Required request part 'file' is not present [내부링크]

MultipartFile을 쓰는 과정에서 다음과 같은 에러가 났다면 MissingServletRequestPartException: Required request part 'file' is not present 다음과 같이 설정config에서 bean을 등록해보자 @Bean(name = "multipartResolver") public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setMaxUploadSize(1000000000); return multipartResolver; }

[Postman] This file isn't in this file isn't in your working directory. Teammates you share this req [내부링크]

postman을 쓰는 과정에서 다음과 같은 에러가 발생했다면 [Postman] This file isn't in this file isn't in your working directory. Teammates you share this request with won't be able to use this file. To make collaboration easier you can setup your working directory in Settings. 경로를 다시 확인해보면 된다 해결방안 postman으로 들어간다 톱니바퀴 > settings를 들어간다 General> working directory를 보면 경로가 나온다 이 경로에 file을 넣어서 쓰면 된다

[java] 객체기준으로 ==, equal차이, hashcode 쓰는 이유까지 이걸로 완벽히 끝내기 [내부링크]

==, equal 차이 우선 말하자면 차이가 없다 무슨말이냐면 equal 메소드 안에 ==으로 구현되어 있다는 말이다. ==, 오버라이드 하기전 equal은 차이가 없다 (int, 상수일경우는 값 그대로를 비교하고 , 객체는 주소값을 비교한다) 그럼 문제다. Person p1=new Person("홍길동", 10) Person p2=new Person("홍길동", 10) p1==p2 는 ? False가 나온다 p1.equal(p2) 는 ? False가 나온다 override equal 이제는 주소값이 아니라 , 안에 있는 필드 값으로 비교를 하고 싶다 . 이제 override를 써야 한다. 디폴트는 주소값을 비교하는 것이니까 나는 안에 있는 필드값으로 같은지를 비교하고 싶은거니깐!! 그래서 아래와 같다 . public boolean equals(Object o) { if(o == null) { return false; } if (o == this) { return true; } if

[spring][spring boot]Lombok의 @Accessors 사용하기 한번에 마스터 [내부링크]

총 3가지 옵션 기본 코드 먼저 보시겠습니다 원래 아시는 대로면 아래와 같을텐데요 3가지 옵션을 적용해볼께요 어떻게 달라지는지 @Getter @Setter public class Account { private String name; private BigDecimal balance; } @Test public void basicAccessors() { Account account = new Account(); account.setName("Standard Accessors"); account.setBalance(BigDecimal.TEN); assertEquals("Standard Accessors", account.getName()); assertEquals(BigDecimal.TEN, account.getBalance()); } Fluent 옵션 @Accessors(fluent = true, chain = false) 을 쓰는 순간 참고로 chain은 기본이 true로 적용되어

[gradle]java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory 오류시 [내부링크]

MultipartFile을 쓰는 과정에서 다음과 같은 에러가 났다면 java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory 다음과 같은 의존성을 추가해준다 본인은 1.4version을 사용하였습니다 (환경에 맞춰서 버전사용하시길 바랍니다.) implementation group: 'commons-fileupload', name: 'commons-fileupload', version: '1.4'

[spring][native_query][Pageable]Table ‘…’ from one of the SELECTs cannot be used in ORDER clause” [내부링크]

상황) native query와 Pageable을 동시에 쓸 때 발생하였습니다. 이유) 원인을 살펴보니 Pageable에 있는 Sort 기능이 !!! native 쿼리의 alias와 매칭이 안되서 입니다. 해결방법) Pageable Sort를 안쓰면 됩니다. + 정렬 기능이 필요하시다면 native query에 직접 명시하면 됩니다. 참고 사이트 : https://database.guide/fix-error-1250-42000-table-from-one-of-the-selects-cannot-be-used-in-order-clause-in-mariadb/ Fix “ERROR 1250 (42000): Table ‘…’ from one of the SELECTs cannot be used in ORDER clause” in MariaDB Fix “ERROR 1250 (42000): Table ‘…’ from one of the SELECTs cannot be used in ORDER c

[spring]Caused by: java.sql.SQLException: Unknown error 1045 [내부링크]

이렇게 떴다면 db를 읽어올수 없다는 에러이니 해결방안 나 같은 경우는 비밀번호가 틀려서 발행한 문제였다 연결이 안되다는 것이니, application.properties에서 이부분을 잘 살펴보길 바란다 spring.datasource.username spring.datasource.password

[spring]Caused by: java.sql.SQLException: Unknown error 1045 [내부링크]

spring 쓰는 @Entity 붙은 객체의 필드와 실제 db의 컬럼이 불일치해서 발생하였따다. 해결방안 (4가지 모두 만족하는지 확인) 1.@Entity 붙은 객체의 필드명과 실제 db의 컬럼명이 불일치하는지 확인해본다. 2. 필드와 컬럼의 타입이 같은지 확인해 본다. 3. 빠진 필드는 없는지 확인해본다. 4. 이름이 잘 읽어와 지는지 확인해본다.

[spring]1차 캐시에 언제 저장될까 [내부링크]

상황) History history = historyDto.dtoToEntity(); System.out.println("여기(1) hist_id: "+history .getId()); History save = historyRepository.save( history ); System.out.println("여기(2) hist_id: "+history.getHistId()); 결과 여기(1) hist_id: null 여기(2) hist_id: 3 코드에서(1)은 null이 나오고 (2)는 값이 나오는 이유 이미 아시는 분들은 아시겠지만, 작게나마 정리하려고 합니다. historyRepository.save 하는 순간 1차캐시를 먼저 뒤져봅니다. hist_id가 키 값이 되겠군요 hist_id를 기준으로 있는지 없는지요 없다고 판단되면 그때 db를 뒤져서 1차캐시에 올려놓습니다. 저 코드는 service단인데요, service단과 ~ repository단의 transaction이 범

[spring] MultiValueMap을 Map과 비교해보고 사용해보자, (특히 http 통신에 사용한다) [내부링크]

상황) spring 에서 http 통신을 하고자 하는데 header과 body를 넣는 과정에서 MultiValueMap 이 사용됨을 알수 있었다. 그래서 Map과의 차이는 무엇인지 어떻게 쓰는지 정리해 보려고 한다. 공식문서 설명을 보자면 Map을 확장하였고 , 여러 값을 갖는다라고 말하고 있다 Map을 확장했다고 하니, 기본 메서드는 그대로 사용할 수 있겠고 여러값을 갖는다고 하니 테스트를 해보았다. 결과 같은 key값을 사용하니 리스트 형태로 값이 추가되는 것인 할수 있다. 참고) 만약 Map이였으면 {a:b}였다가 --->{ a:c}로 변경되었을 텐데 !!

[mysql] incorrect string value: '\xec\x8b\xa4\xed\x8c\xa8...' for column 오류 발생시 [내부링크]

테이블 설정이 잘못 들어가서 그런 것이다. 아에 명령어를 쳐본다면 잘될것이다. ALTER TABLE 테이블명 CONVERT TO CHARSET UTF8

[native query][spring] like 조건문 걸고 싶다면 [내부링크]

이렇게 간단히 쓰자 name LIKE CONCAT('%', :name, '%')

Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row [내부링크]

상황 Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails(`DB`.`테이블명`, CONSTRAINT `fk_테이블명_외래키` FOREIGN KEY (`외래키`) REFERENCES `참조하는 테이블` (`참조하는 테이블의 키`) ON DELETE NO ACTION ON UPDATE NO ACTION) 해결방법 (`DB`.`테이블명`, CONSTRAINT `fk_테이블명_외래키` FOREIGN KEY (`외래키`) REFERENCES `참조하는 테이블` (`참조하는 테이블의 키`) ON DELETE NO ACTION ON UPDATE NO ACTION) 를 자세히 보고 해결했다 테이블명에 있는 외래키 가 참조하는 테이블의 키가 존재하지 도 않는데 update해서 생긴 문제였다. 참고로 controller에서 ex

org.hibernate.HibernateException: The database returned no natively generated identity value [내부링크]

상황) spring data jpa를 사용해서 코드를 짜고 있었는데 이러한 에러가 났다 원인) db 세팅 문제였다 해결방법) 본인은 mysql이다. mysql로 가서 스크립트에 다음과 같이 적어주면 해결 ALTER TABLE (테이블명) MODIFY COLUMN (primary key에 해당하는 id) INT auto_increment

[Error]When allowCredentials is true, allowedOrigins cannot contain the special value "*" since [내부링크]

에러 발생시 When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead. 해결방법 수정전 configuration.setAllowedOrigins(Arrays.asList("*")); configuration.setAllowCredentials(true); 위에 두줄을 합쳐서 수정후처럼 한줄로 만든다 configuration.setAllowedOriginPatterns(Arrays.asList("*"));

[native query]union 과 Pagealbe 쓸 때, "could not extract ResultSet; SQL [n/a]; nested exception is org [내부링크]

다음과 같은 에러 발생시 "could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet" 해결방법 @Query(nativeQuery = true, value = "(select * from 조건문) union (select * from 조건문) ", countQuery = "(select * from 조건문) union (select * from 조건문) ", Page<Entity명> searchDynamicConditionAndUsePageable(Pageable pageable); value와 동일하게 countQuery 을 채워서 추가해 주면 해결

org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible [내부링크]

[2023-08-02 15:51:30.724][INFO ] {http-nio-8000-exec-1} ex.getStackTrace():org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374) - (PackageController.java:99) 상황) delete 할때 자꾸 spring data jpa 관련해서 에러가 난다고 떴다 SimpleRepository.deleteByParam(parm); 해결)SimpleRepository와 관련된 Simple 객체에서 Param의 타입을 확인하니 객체였다... 계속 Long 타입으로 넘긴게 문제였따.. <수정 전> SimpleRepository.deleteByParam(parm); //Long parm 을 <수정 후> SimpleRepository.deleteByParam(

cannot add or update a child row: a foreign key constraint fails 해결방법 [내부링크]

참조테이블에 없는 값을 추가해서 발생한 오류 외래키가 바라보는 ---> 참조테이블에 1 1 (가능) 1 2 (가능) 2 (가능) 3 (불가능) 참조테이블에 3이 없기 때문이다. 해결방법) 참조 테이블에 3이 들어가도록 추가해주거나 외래키가 있는 테이블에서 3을 제거해주거나

[JAVA] instanceof 코드로 한번에 정리 _ 더 이상 찾아 볼 필요 없도록 [내부링크]

코드) 코드를 보고 결과를 예측해보세요 public class Person { public static void main(String[] args){ Dancer d = new Dancer(); Person p1 = new Person(); Person p2 = (Person) d; System.out.println("Dancer? " + (d instanceof Person)); System.out.println("Person? " + (p2 instanceof Person)); System.out.println("Dancer? " + (p1 instanceof Dancer)); System.out.println("Dancer? " + (p2 instanceof Dancer)); System.out.println("Actor? " + (p2 instanceof Actor)); } } class Dancer extends Person { } class Actor extends Per

[spring][spring security] post로 http://localhost:8080/login 에 찔렀는데 왜 서버에서 값이 내려오지 않을까?원인은 CSRF TOKEN [내부링크]

상황) 아래 그림과 같이 postman으로 send를 했습니다. 내려온 결과같은 아래의 그림과 같습니다. (제가 원한 화면은 controller로 지정한 화면이라던가, RESTful API라면 데이터일텐데 그 아무것도 해당하지 않는 response가 나타나고 있어요) 그 이유는 CSRF 토큰 때문이였습니다. 해결) 아래 그림과 같이 postman으로 새롭게 send를 했습니다. 내려온 결과같은 아래의 그림과 같습니다. (로그인 후에 나오는 메인화면 html이 나왔습니다) CSRF 는 무엇인가? 심화) CSRF(Cross Site Request Forgery) 공격 = > (사이트간 요청 위조) 공격 예를 들어 사용자: 사용자가 정상적인 로그인 권한을 획득하고 게시글 작성을 시도합니다. (naver.blog) 공격자: 공격자가 피싱사이트를 교묘히 끼워넣었습니다 (navar.blog) 사용자: 공격자가 만든 피싱사이트에 "안녕하세요" 를 입력합니다. 공격자: 권한 정보와 "안녕하세요"를

[spring]java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '?' for key 'PRIMARY' 에러시 [내부링크]

error java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '?' for key 'PRIMARY' 상황) java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '특정 값' for key 'PRIMARY' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:118) ~[mysql-connector-j-8.0.33.jar:8.0.33] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.33.jar:8.0.33] at com.mysql.cj.jdbc.ClientPreparedStatement.exec

[java][rabbitmq] implementation 'com.rabbitmq:amqp-client 를 사용해서 direct, topic, header 모두 코드로 써보자 [내부링크]

gradle 환경에서 진행했습니다. 아무리 찾아도 direct, topic, header 모두 모아놓은 코드가 없어서 직접 작성하였습니다. 환경설정 dependencies { ... implementation 'com.rabbitmq:amqp-client:5.16.0' } direct producer 또는 publish @SpringBootApplication public class ProducerApplication { private final static String QUEUE_NAME = "sample.queue1"; public static void main(String[] args) throws IOException, TimeoutException { String name="sample"; try { //연결 객체 생성 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("rabbitmq ip주소");

[java] convert between Unix epoch time <--> LocalDateTime , Unix&epoch 와 LocalDateTime 사이의 양방향 변환 [내부링크]

Unix epoch tim ->LocalDateTime import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; public class EpochToLocalDateTime { public static void main(String[] args) { //Epoch point of time is 1970-01-01T00:00:00Z long timeInSeconds = 1567109422L; //Using LocalDateTime.ofEpochSecond LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(timeInSeconds, 0, ZoneOffset.UTC); System.out.println(localDateTime); //Using I

application.properties에서 Spring data jpa 를 설정해보자. 코드 및 설명 (ddl-auto, format_sql , show_sql) [내부링크]

내 코드 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.show_sql=true 1. spring.jpa.hibernate.ddl-auto=update ddl-auto 옵션 종류 create: app이 구동될 때마다, 기존테이블 삭제 후 다시 생성 (DROP + CREATE) create-drop: 종료시점에 테이블 DROP update: 변경분만 반영, (컬럼 추가는 문제가 되지 않지만, 삭제시에 문제가 된다,,,기존 엔티티에서 필드가 삭제되었다면 반영하지 못하기 때문) validate: 엔티티와 테이블이 정상적으로 유효한지만 확인 2. spring.jpa.properties.hibernate.format_sql=true 쿼리를 예쁘게 보여준다 3. spring.jpa.properties.hibernate.show_sql

ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironm [내부링크]

ServiceException: Unable to create requested service[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcE

[JAVA] 스레드 환경에서 BlockingQueue 가 필요하다면 살펴보기_interface 특징 정리, 구현체 정리, LinkedBlockingQueue 사용법 코드예시 [내부링크]

참고문헌) https://docs.oracle.com/javase/8/docs/api/?java/util/concurrent/BlockingQueue.html Overview (Java Platform SE 8 ) java.applet Provides the classes necessary to create an applet and the classes an applet uses to communicate with its applet context. java.awt Contains all of the classes for creating user interfaces and for painting graphics and images. java.awt.color Provides classes for color spaces. java.awt.dat... docs.oracle.com BlockingQueue 필요한 상황 여러개의 작업을 병렬로 처리해야 할때 본인의 경우는) [Spring]

[Gradle][task] gradle 에서 task 종속성 _ task 등록 직전직후(before afterTask), 종속성 관계 설정(dependsOn,finalizedBy) [내부링크]

dependsOn tasks.register("a"){ println "a" } tasks.register("b"){ dependsOn a println "b" } ./gradlew b를 호출하면?!! 결과는 dependsOn Task1를 쓰면 Task1을 먼저 실행해라 입니다. finalizedBy tasks.register("a"){ println "a" finalizedBy b } tasks.register("b"){ println "b" } ./gradlew a를 호출하면?!! 결과는 finalizedBy Task1를 쓰면 Task1을 나중에 실행해라 입니다. beforeTask 와 afterTask gradle.taskGraph.beforeTask { Task task -> println "executing $task ..." } gradle.taskGraph.afterTask { Task task, TaskState state -> if (state.failure) {

[Gradle][task] gradle 에서 코드 작성에 따른 Configure project 및 일반 Task 로서의 실행 [내부링크]

task 종속성 1) task task이름(type: Type) { println "task1" } 2) tasks.register('task 이름',Type) { println "task2" } 똑같은 task 등록 이라고 생각했는데,,, 1) 과 2)의 차이점이 있을까?? 내 터미널 창에서는 차이가 있었다. 바로 포스터를 쓰게된 이유이다. 밑애 결과 창을 보면서 현상을 소개하겠다. task 실습 task a(){ println "a" } task c(){ println "c" } tasks.register("d"){ println "d" } tasks.register("rpmSetting") { println "rpmSetting" } task b(){ dependsOn rpmSetting println "b" } 이제 ./gradlew c 했을 때 결과를 보겠다!! 실습에 대한 결과 정리를 하자면 1첫번째) task task이름(type: Type) 는 Configure pro

[Gradle][task] maven이 아닌 gradle 에서 rpm 패키징 만들기_gradle, tasks, rpm, rpm plugin [내부링크]

maven은 정보가 넘쳐나는데 gradle 버전은 부족한거 같아서 이 게시물 하나로 해결해기 위해 작성 하였다. rpm plugin buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'com.netflix.nebula:gradle-ospackage-plugin:8.4.1' } } apply plugin: 'nebula.rpm' repositories 는 라이브로리를 보관한 저장소를 의미한다. 왜 두개(jcenter(), mavenCentral())를 썼느냐고 물어보실 수 있다 ! 두개를 쓰는걸 권장한다. 상호보완적인 의미로 mavenCentral()은 이전부터 사용해온 저장소라고 하지만.., 만든 라이브러리를 올리는 과정이 복잡하다 이걸 보완하려고 나온게 jcenter 이다. jcenter에 업로드를 하면 mavenCentral 에도자동으로 올라가니 얼마나 편안해 졌는가 ! dependen

[Gradle][task] maven이 아닌 gradle 에서 "git" 사용하기_gradle, tasks, git, git plugin [내부링크]

maven은 정보가 넘쳐나는데 gradle 버전은 부족한거 같아서 이 게시물 하나로 해결해기 위해 작성 하였다. git plugin buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'classpath "org.ajoberstar:grgit:1.3.0"' //classpath "org.ajoberstar.grgit:grgit-gradle:5.0.0-rc.3" //위에 안될 시 밑에 라이브러리 사용해보세요 ~ } } apply plugin: "org.ajoberstar.grgit" repositories 는 라이브로리를 보관한 저장소를 의미한다. 왜 두개(jcenter(), mavenCentral())를 썼느냐고 물어보실 수 있다 ! 두개를 쓰는걸 권장한다. 상호보완적인 의미로 mavenCentral()은 이전부터 사용해온 저장소라고 하지만.., 만든 라이브러리를 올리는 과정이 복잡하다 이걸

[spring] repository 에서 Entity가 아닌 pojo 매핑 (interface , dao 사용) [내부링크]

interface native query가 아닐때도 interface로 매핑이 가능하다. <TestRepository > @Repository public interface TestRepository extends JpaRepository<TestEntity, Long> { //<Interface 쓰는 방식> @Query("SELECT " + "a.column1 as column1, " + "a.column2 as column2, " + "a.column3 as column3" + "FROM TestEntity AS a " + "WHERE a.column1= :value ") List<TestInterface> testWithInterface(@Param(value = "value") int value); } <TestInterface> public interface TestInterface{ int getColumn1(); String getColumn2(); String getC

MYSQL SELECT list is not in GROUP BY clause and contains nonaggregated column which is not 에러 발생시 [내부링크]

mysql 에서 밑에 코드를 실행 SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; 원래 sql_mode의 default(5.7.x 기준) ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

MYSQL 조건문 (IF 문 , CASE 문) [내부링크]

IF 문 정의) if("상황", "참일 경우 값" ,"거짓일 경우 값") AS "지정하고자 하는 이름" 활용) NUM 컬럼에 A가 0보다 작으면 -> 0 아닐경우 -> A가 가진 값을 표시 if(A<0,0, A) AS NUM CASE 문 정의) CASE WHEN "상황1" THEN "결과값1" WHEN "상황2" THEN "결과값2" ELSE "그 외" END AS "지정하고자 하는 이름" 활용) NUM 컬럼에 A가 0보다 작으면 -> "음수" A가 0이면 -> "0" A가 0보다 크면 -> "양수" 값을 표시 CASE WHEN A<0 THEN "음수" WHEN A=0 THEN "0" ELSE "양수" END AS NUM,

ConverterNotFoundException: No converter found capable of converting from type 에러시 [내부링크]

상황) native 쿼리를 쓰는 상황에서 org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type 이런 오류가 발생했다 org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type 이유) 매핑이 잘 안되서 발생한 문제이다. 해결) testInt

No validator could be found for constraint'javax.validation.constraints.NotEmpty' 에러시 [내부링크]

No validator could be found for constraint 'javax.validation.constraints.NotEmpty' validating type 'java.lang.Integer'. validation 애노테이션인 @NotEmpty는 integer타입을 지원하지 않는다는 것입니다. @NotNull로 바꾸면 해결 되실 겁니다 ~

PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; 에러시 [내부링크]

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not determine type for: java.util.List, at table: member, for columns: [org.hibernate.mapping.Column("컬럼명")] table: member 테이블에 + "컬럼명" 을 가진 필드가 재대로 생성 안되니 지우던가 or 타입을 변경 하면 된다.

[java][spring] entity값이 h2 database에 안올라갈때 [내부링크]

application.properties 에서 두개 중 하나 선택 해서 입력한다. spring.jpa.hibernate.ddl-auto=create spring.jpa.hibernate.ddl-auto=create-drop 참고로) 옵션 정보 create: 기존 테이블 drop하고 create (대부부 default) create-drop: 기존 테이블 drop하고 create하고 종료시점에 다시 drop (in memory db에서 defalut) update: 변경된 것만 반영 validate : 엔티티와 테이블의 mapping 정보만 확인 none : 말그대로 아무행동 x 개발단계 연습용 : 모두 가능 개발기 : update:부터 가능 배포 : validate 또는 none 만 가능

UnableToConnectException: CLIENT_PLUGIN_AUTH is required._intellij , dbeaver 해결법 [내부링크]

제가 해결한 방법은 db서버의 버전과 사용하고자 하는 플랫폼(인텔리제이, 디비버)의 버전을 맞춰 줬습니다. 먼저 db 서버의 버전을 확인하세요 !!! 저는 dbeaver 툴 > 해당 db의 system info > session variable를 통해 해당 db의 버전이 5.1.52 임을 확인했습니다 이제 5.x.x 로 맞춰 줄 것입니다. 먼저 intellij 해결법 1)intellij에서 version 을 지정하여 기입해준다. 맞는 버전은 https://mvnrepository.com/artifact/mysql/mysql-connector-java 에서 맞는 버전 확인이 가능합니다 2) dbeaver 에서 맞추기 이미 db 연결한 상태인데 뜨는 오류라면 오른쪽 마우스 클릭 > edit connection 들어가서 edit deriver setting 에 들어간다 libraried를 눌러 기존의 있는 것들은 삭제 하고 add file을 누른다 https://mvnrepository.

[spring] 회원가입시 ROLE_USER에서 ROLE_ADMIN, ROLE_USER 동시에 가지도록 바꾸기 [내부링크]

회원가입시 ROLE_USER 만 가지도록 코드 package uha.jwttest.service; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; import uha.jwttest.dto.ExcelDto; import uha.jwttest.dto.UserDto; import uha.jwttest.entity.Authority; import uha.jwttest.entity.User; import uha.jwttest.entity.UserRepository; import uha.jwttest.exception

[spring] jwt Token 초간단 개념(jwt Token 을 활용한 로그인 유지, 토큰 검증) Gradle 쉬운 코드 + 쉬운 주석 설명으로 따라해보기 (2-2) [내부링크]

JwtFilter extends GenericFilterBean (GenericFilterBean를 상속받은 필터) (basicauthenticationfilter이런거 써도 됩니다!) JwtFilter.java 권한 인증을 위한 필터로 여기는 무조건 거치게 되어있습니다. (왜 인지 궁금하신 분들은 spring filter 로직 참고하시면 좋을 거 같네요.) public class JwtFilter extends GenericFilterBean { //basicauthenticationfilter private static final Logger logger = LoggerFactory.getLogger(JwtFilter.class); public static final String AUTHORIZATION_HEADER = "Authorization"; private TokenProvider tokenProvider; public JwtFilter(TokenProvider token

[spring security] thymeleaf를 이용한 회원가입/ 로그인/ 로그인 유지/ 비밀번호 5번 count / 계정 잠금까지 "한번에" 설명_22.10월 최신버전 [내부링크]

SecurityConfig.java package uha.thymeleaftest.config; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.security.servlet.PathRequest; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

[spring] jwt Token 초간단 개념(jwt Token 을 활용한 최초 로그인, 토큰 생성) Gradle 쉬운 코드 + 쉬운 주석 설명으로 따라해보기 (2-1) [내부링크]

jwt Token 을 활용한 최초 "로그인"= 다시 말해 토큰 생성 본격적으로 jwt Token 을 위한 로직 구현 시작해 보겠습니다! controller 작성 AuthController.java (get으로 받는 /api/authenticate) @GetMapping("/authenticate") public String authorize( Model model) { model.addAttribute("member", new LoginDto()); return "/user/loginForm"; } 이제 경로 "/user/loginForm" 하위 html 파일로 이동 loginForm . html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h1>로그인</h1> <hr> <form th:action="@{

[spring] jwt Token 초간단 개념들어가기 전_security setting + Gradle 쉬운 코드 + 쉬운 주석 설명으로 따라해보기 [내부링크]

차근차근 따라해보세요 ~! build.gradle에 추가 build.gradle에 추가 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-

[spring] jwt Token 초간단 개념 + Gradle 쉬운 코드 + 쉬운 주석 설명으로 따라해보기 (1) [내부링크]

목차 [spring] jwt Token 초간단 개념 + Gradle 쉬운 코드 + 쉬운 주석 설명으로 따라해보기 시리즈 [spring] jwt Token 와 controller service 초간단 개념 + Gradle 쉬운 코드 + 쉬운 주석 설명으로 따라해보기 시리즈 [spring] jwt Token 를 서버 배포까지 + Gradle 쉬운 코드 + 쉬운 주석 설명으로 따라해보기 시리즈 JWT TOKEN 초간단 개념 (토큰=Token) JWT는 속성 정보 (Claim)를 JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준 입니다. (참고자료 읽어보시고, 이해가 안되시거나 + 의논이 필요하시다면 댓글 달아주세요~ ) https://catsbi.oopy.io/26b7f35c-e323-4e75-a9ee-2fe3e57ac641 JWT(JSON Web Token) 개요 catsbi.oopy.io 이런 설명이 있는데 쉽게 말하자면 jwt 는 payload에 claim 부분이 있다. 이

[git] git status - 초간단 개념, 초간단 실습 [내부링크]

git status staging area에 올라온 파일의 상태를 알수 있다 -> 수정여부 확인가능 commit을 하기전에 git status를 이용해 add가 잘되었는지 확인할 수 있다. -> 누락여부 확인가능 실습 git status를 입력한다 git status <실행결과> 전과 비교하여 변경되었는지 알수 있다.

[git]commit을 위한 세가지 영역 - working directory , staging area , repository 초간단 개념 설명 , 모식도 [내부링크]

세가지 영역 working direcotry ---(git add)---> staging area ---(git commit)---> repository 작업하는 영역이다 commit을 하기 위한 장소이다 버전별로 올라가는 장소이다 간단 모식도 <1단계> working direcotry ---(git add)---> staging area ---(git commit)---> repository a.txt - hello ---(git add a.txt)---> a.txt - hello ---(git commit -m "ver1")---> a.txt - hello b.txt - world ---(git add b.txt)---> b.txt - world b.txt - world <2단계> working direcotry ---(git add)---> staging area ---(git commit)---> repository a.txt - hello~~ a.txt - hello ---

[git] repository 초간단 뜻, 초간단 생성실습 [내부링크]

repository 뜻 <정의> git으로 버전을 관리하면 (원하는 시간에 어떤 작업을 했고 어떤 내용물이 있는지---> 기록물) 만들 수 있다. git이 이러한 기록물들을 저장하는 곳을 repository 라고 한다 즉 , repository에는 시간 순서대로 버전별로 담겨있게 된다. <형태> .git 디렉토리 = repository = commit이 저장되는 곳 <참고> 참고로 버전으로 남기는 행위는 commit이라고 부른다. ( 고정된 결과물 자체도 commit이라고 부른다.) repository 생성방법 작업중이던 프로젝트 디렉토리로 가서 git init 명령어를 입력 git init 그럼 처음에 git은 빈 레퍼지토리를 생성한다 실습 결과

[git] commit 초간단 개념, 초간단 실습 [내부링크]

commit 개념 버전을 관리해주는 git 프로그램을 이용해서 1)버전별로 남기기 위한 행위를 commit한다 한다 2)또는 버전별로 남겨진 결과물도 commit이라 한다. commit 실습 첫 commit 할떄 주의사항? commit을 누가 했는지 밝힌다(이름, 이메일) 이름을 밝힌다. git config user.name "username" git config user.name "username" 2. 이메일을 밝힌다. git config user.email "email address" git config user.email "email address" 3. add ( commit 할 파일을 미리 지정) git add 파일명 git add 파일명 4. commit git commit -m "커밋 메세지" (-m : 커밋 메세지를 남길 수 있는 옵션) git commit -m "커밋 메세지" 참고) untracked : 버전 관리의 대상이 아니다 <실행결과> 참고) 결과의 해석 2

[git]git bash 를 한국어 설정으로 바꾸는 법 - 초간단 방법 [내부링크]

한국어 설정 1. gti bash 실행 2. 오른쪽 마우스 클릭 option 클릭 3. text의 언어 설정을 그림과 같이 저장

[github] how to Git bash here - 초간단 정리 [내부링크]

Git bash here 매번 git bash를 실행하고 폴더를 이동하는 작업이 불편할 수 있으니 이렇게 초간단 사용하세요 git 전용 디렉터리 생성 후 오른쪽 마우스 클릭 3. git bash here 를 클릭

[github] github를 이용하기 위해 git을 설치해보자 - win기준 , git install, 초간단 설치, 링크 첨부 [내부링크]

git install 1.링크 클릭해 버전에(win기준 32bit , 64bit)맞게 다운로드 https://git-scm.com/download/win 2. 다운 받은 실행 파일을 진행합니다 3. next 4. 꼭꼭 git bash here 체크해주세요 !! 5.next 6.next 7.next 8.next 9.next 10.next 11.next 12.next 13.next 14. 설치 진행 중 15. lanch git bash 체크 view release nores 체크 해제후 finish

[github] git, github 초간단 뜻- 필요성 [내부링크]

git 지난번에 작성하던 1.0.x 작업물 지난번에 작업하던 2022.7. x 작업물 아 작성하던 코드 오류났는데 다시 이전 작업물 로 부르기 위해 사용한다 + 다른 사람과의 협업을 위해서도 git이 필요하다 github 이를 위해서 내 컴퓨터가 아닌 다른곳에 저장할 필요가 있다. 무료로 이런 환경을 제공하는 것이 github이다 정리 즉, 이런 작업물은 관리하는 프로그램이 git! git으로 관리하는 프로그램을 올려두는 것이 github이다 원격저장소인 셈이다!

[Java][spring] 쿼리 파라미터 로그로 남기기 - 초간단 방법 [내부링크]

방법 application.yml에서 아래 하단을 추가해 준다 말그대로 log 찍는 레벨에서 jpa(관계형 데이터 베이스 작동하는 방식을 기술한 인터페이스)의 구현체인 hibernate는 추적을 남겨라~ 이런 뜻입니다. logging.level: org.hibernate.type: trace 적용 모습 전에는 파라미터가 ?로만 떴다면 이제는 내가 넣은 데이터가 눈으로 보이는 모습을 확인 할 수 있다.

[Java] devtools 라이브러리 - 초간단 적용 개념 , 초간단 적용 방법 [내부링크]

devtools 개념 서버의 재시작 없이 오로지 컴파일만 해주면 html 화면을 바로바로 확인할 수 있다. 적용 방법 build.gradel의 dependecied에 한줄만 추가해준다 implementation 'org.springframework.boot:spring-boot-devtools' 2. 적용을 위해 gradel update 한다 = 코끼리 버튼 눌러 새로고침 하라는 뜻이다 3.html 코트가 바뀌었다면 build 탭에서 컴파일만 해주면 된다.

[Java] Junit5 에서 Junit4로 변경 방법 - 초간단 변경 [내부링크]

초간단 변경 방법 dependencies 부분에 이렇게 추가만 해주면 됩니다 testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" }

[Java] 웹 애플리케이션을 위한 spring boot dependencies 설정 - web, thymeleaf, jpa, lombok, validation 초간단 개념 [내부링크]

spring boot dependencies 설정 1) spring boot 를 이용한 세팅을 위해 들어간다 https://start.spring.io/ Spring Initializr Initializr generates spring boot project with just what you need to start quickly! start.spring.io 2) 그림과 같이 web, thymeleaf, jpa, lombok, validation 추가한다 web, thymeleaf, jpa, lombok, validation 초간단 개념 1)web : restful를 이용하기 위해 . mvc를 이용하기 위해 , 내장서버인 톰캣을 이용하기 위해 2)thymeleaf : 화면은 띄어주기위해 = view를 렌더링 하기 위해 = 컨트롤러에서 반환하는 template를 듸어주기 위해 사용하는 엔진이다 다른 엔진의 종류가 3가지나 더 있다 (그림 참고) 3)jpa : 인터페이스를 모아둔 것이

[Java]AppConfig 의 진화 (2) - AppConfig 리팩토링 [내부링크]

기존 AppConfig 문제 1)매번 구현체가 바뀌면 LocalmemoryRepository() 부분을 바꿔주야 한다 2) 구조가 눈에 잘 보이지 않는다 public class AppConfig { public MemberService memberService(){ return new MemberServiceImpl(new LocalmemoryRepository()); } public OrderService orderService(){ return new OrderServiceImpl(new LocalmemoryRepository(), new RateDiscountPolicy()); } } AppConfig 리팩토링 1) private MemberRepository memberRepository() { return new LocalmemoryRepository(); } 이렇게 따로 분리 시켜 줌으로써 구조를 한누에 보기 쉽고 정확히 말하면 전에는 MemberRepository의 구현

[JAVA] 의존관계 주입(Dependency Injection: DI) 3가지 방법 - 초간단 개념, 초간단 설명, 초간단 코드 설명 [내부링크]

컨테이너에 스프링 빈이 등록되었다면 서로 연결 시켜주는 작업이 있어야 한다. 이럴때 연결시켜주는 작업인 의존관계 주입이 필요하다 (참고로 추상화 원칙에 의해 코드 자체 내부는 건들지 않고 설정파일을 만들어 변경을 시켜주는 것을 권장한다. 설명이 이해가 가지 않거나 코드가 필요하시다면 댓글남겨주세요 ) 의존관게 주입의 3가지 방법 1)생성자 주입 - 매우 중요 2)setter 주입 (일반 메서드 주입) - 적당히 중요 3) 필드 주입 - 볼 필요 없음 참고로) 스프링빈으로 등록된 곳에서 Autowired를 써야 한다. 1)생성자 주입 - 매우 중요 생성자를 통해서 의존관계를 주입한다. 생성자는 객체를 호출할때 딱 학번 실행되기에 의도적으로 메소드를 통해 변경이 불가 하므로 불변의 느낌을 가지면 된다. public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository;

[JAVA] 코드의 간소화를 위한 Lombok 라이브러리 - 초간단 개념, 초간단 사용 적용, 초간단 사용법, 초간단 심화 [내부링크]

Lombok 의 초간단 개념 getter, setter, toString 등의 작성 코드를 간소화 시켜주는 라이브러리입니다. win+intellij 기준 , 초간단 사용 적용 1)IDE를 이용해 프로젝트를 열고 build.gradle 에 들어간다 2) 이제 아래 코드를 추가해준다 그냥 기입 configurations { compileOnly { extendsFrom annotationProcessor } } dependencies에 해당하는 곳에 기입 dependencies { implementation 'org.springframework.boot:spring-boot-starter' //lombok 라이브러리 --------------------------- compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lomb

[Java]AppConfig 의 진화 (1) - 구현객체 생성, 생성자를 통한 DI (의존 주입) [내부링크]

AppConfig 의 필요성 코드의 기능을 확장할때 기존 코드의 변경없이 AppCofing만 고치면 된다 ----> OCP 를 참고 AppConfig 프로그래밍 두단계로 진행된다. 1)Appconfig 작성 2)생성자 주입 1)Appconfig 작성 App 내에서 또는 테스트를 할때 memberService를 호출한다. 그럴 때 AppCofing에서 객체를 생성되도록 해준다. package simple.service; import simple.service.discount.RateDiscountPolicy; import simple.service.memberservice.MemberService; import simple.service.memberservice.MemberServiceImpl; import simple.service.orderservice.OrderService; import simple.service.orderservice.OrderServiceImpl; impor

Java Service 코드 작성 - interface , 구현체 분리(역할과 구현의 분리) [내부링크]

MemberService interface 회원가입 회원탈퇴 아이디로 검색 이름으로 검색을 위한 인터페이스 설계 package simple.service.memberservice; import simple.service.member.MemberEntity; public interface MemberService { void join(MemberEntity memberEntity); void secession(Long Id); MemberEntity findMemberById(Long Id); MemberEntity findMemberByName(String name); } MemberSeriviceImpl 프로그래밍 package simple.service.memberservice; import simple.service.member.MemberEntity; import simple.service.repository.LocalmemoryRepository; import simple.

[Java] Junit 테스트를 위한 라이브러리 - 초간단 개념, 단위테스트 개념, 애노테이션(@) 사용 [내부링크]

Junit 개념 어플리케이션 로직(본 서버에서 운영한다는 뜻)으로 테스트 하는 것은 좋은 방법이 아니다 . 컴파일에 소스가 끼어들어갈 걱정도 없고, 분리되어 실행이 가능하고, 순수 코드로 단위테스트가 가능하며, 여러번 여러개를 실행해도 가능하게 만들어 주는 것이 Junit 이다 단위테스트 개념 순수 코드로서 동작을 볼 수 있고 , 메소드 단위로 분리하여 운영이 잘됨을 확인하는 테스트 Junit을 이용한 Test 프로그래밍 1) 단위테스트를 진행하거나 통합 환경 테스트를 진행하기위해 @TEST를 사용해야 한다 (import org.junit.jupiter.api.Test;) 을 import 해줘야 한다 2) JoinTest 만 실행이 가능하다. 개별 메소드만으로도 테스트가 가능함을 뜻한다 3) application에 영향을 주지 않기 때문에 개발을 위해 사용 권장 ! 4) 올바르게 코드를 작성했다면 아래와 같은 화면이 뜬다 프로그래밍 코드 package simple.service.me

Java Repository 코드 작성 - interface , 구현체 분리(역할과 구현의 분리) [내부링크]

Repository interface 멤버 객체를 save하는 기능과 id를 이용해 멤버를 찾는 기능을 위한 인터페이스를 구현 package simple.service.repository; import java.lang.reflect.Member; public interface MemberRepository { void save(Member member); Member findById(Long id); } LocalmemoryRepository 구현체 HashMap을 이용하여 받아온 인스턴스를 저장하고 조회하는 기능을 구현 package simple.service.repository; import simple.service.member.MemberEntity; import java.lang.reflect.Member; import java.util.HashMap; import java.util.Map; public class LocalmemoryRepository implements

Java 회원 엔티티 생성 (등급, 성별 적용)_ enum 사용 [내부링크]

Grade enum 3가지 등급을 적용(브론즈 , 실버, 골드) package simple.service.member; public enum Grade { BRONZE, SILVER, GOLD } sex enum 성별 등록(남, 여) package simple.service.member; public enum Sex { M, W } member entity 5가지 항목 (아이디, 이름, 나이 , 등급, 성별)에 대해 생성자 getter 와 setter를 작성 (자바 규약을 지킴) package simple.service.member; public class MemberEntity { private Long id; private String name; private Long age; private Grade grade; private Sex sex; public MemberEntity(Long id, String name, Long age, Grade grade, Sex sex) {

클래스 다이어그램, 객체 다이어그램 _ 초간단 개념, 초간단 모식도 [내부링크]

클래스 다이어그램 1)기획자가 제안한 여러 개체의 협력관계를 -----> 2)개발자가 구체화 한 것이다 그렇기에 클래스 다이어그램은 인터페이스와 구현체가 모여있다. 서버를 실행하지 않고, 즉 코드만 보고도 분석해서 알수 있는 형태이다. 1)기획자가 제안 2) 개발자가 새롭게 작성한 모식도 = 클래스 다이어그램 객체 다이어그램 서버가 실행이 되어 실제로 동작할떄 확인할 수 있는 그림으로 서버가 실행되기 전에는 local 메모리를 쓸지 , DB를 쓸지 모르기 때문이다. 저장소가 인터페이스이고 local 메모리와, DB는 구현체로 구현했기에 테스트 환경에서, 실제 환경에서 개발자의 마음으로 가져다가 바꿔쓸 수 있다. 그렇기에 local 메모리를 쓸지 , DB를 쓸지 모른다고 말한 것 이다. 객체다이어그램

MVC 와 템플릿 엔진 사용법 및 프로그래밍 - 스프링 웹 개발 기초 [내부링크]

MVC 와 템플릿 엔진 MVC는 Model, View, Controller를 의마한다. view는 화면을 그리는데 집중하...

스프링 API 이용법 및 프로그래밍 - 스프링 웹 개발 기초 [내부링크]

API 과거에는 xml을 사용하였으나 무겁고 태그를 열고 닫고 불편하기에, 요즘은 json 데이터 포맷방식으...

스프링 부트 이용법, 스프링 프로젝트 생성(2)- spring boot, spring project create [내부링크]

참고) intelliJ 무료 설치 https://m.blog.naver.com/seaqkswkr/222725036641 intelliJ 를 실행 만든 스...

스프링 부트 이용법, 스프링 프로젝트 생성(1)- spring boot, spring project create [내부링크]

스프링 부트 이용 사이트로 이동 https://start.spring.io/ 이런 화면이 뜨게 된다 gradel project 선택 언...

스프링 정적 컨텐츠 - 스프링 웹 개발 기초 [내부링크]

정적 컨텐츠 정적 컨텐츠는 서버에서 하는 일 없이, 파일을 웹 브라우저에 그냥 내려준다. https://docs.sp...

intelliJ 무료버전 설치 - 윈도우, Free& built on open source [내부링크]

intelliJ 무료버전 설치 사이트에 들어가 준다 (윈도우 버전) https://www.jetbrains.com/idea/download/#...

JAVA version 버전 확인 및 버전 업데이트 (JDK 업데이트) [내부링크]

버전 확인 제어판으로 이동 프로그램 선택 JAVA 선택 일반사항 탭의 정보를 선택 업그레이드 일반사항 ...

Error sol) Error running 'main.dart': Entrypoint doesn't contain a main function [내부링크]

환경변수 고려, 에뮬레이터가 올바르게 설치되었는지 확인, java 버전확인 등 여러 가지 고려가 필요합니다...

DART 1)알아보겠습니다_특징 및 설치방법 [내부링크]

간단히 특징을 살펴보면 1.라이브러리 활용 다트언어는 구글에서 만들고 지원하는 방대한 라이브러리가 존...

SOCKET(소켓) 이론 및 응용 프로그래밍 (1) [내부링크]

socket(소켓)이 무엇일까? 저는 이렇게 표현하고 싶어요 데이터 통신을 할떄 ! 종착지와 같은 역할을 수행...

SOCKET(소켓) 응용 프로그래밍_coding 편 (2) [내부링크]

오늘의 코딩) window ver. 서버-클라이언트 모델에서 통신을 어떻게 하는지 확인할 수 있는 tcp 프로그래밍...

SOCKET(소켓) 응용 프로그래밍_coding 편 (3) [내부링크]

1. 클라이언트 main.cpp 에 코드 2. 서버 main.cpp 에 코드 3. 솔루션을 빌드 합니다 솔루션 우클릭 -&gt; ...