해당 내용은 chat GPT에 질문하여 생성된 내용 입니다. 참고만 하시길.. 

Q : Spring 프레임워크에서 제어의 반전 개념과 그것이 어떻게 구현되는지 설명
A : 제어 반전(IoC)은 소프트웨어에서 더 나은 모듈화와 유연성을 허용하는 설계 패턴이다. 구성 요소가 종속성을 선언하도록 허용하고 실행 시 IoC 컨테이너가 종속성을 주입하도록 함으로써 프로그램의 전통적인 제어 흐름을 뒤집는 것을 포함한다. Spring 프레임워크는 메타데이터를 사용하여 빈이라고 하는 애플리케이션 개체의 인스턴스를 구성하고 관리하는 IoC 컨테이너의 예입니다. IoC 컨테이너를 사용하여 종속성을 관리함으로써 개별 구성요소 자체를 변경할 필요 없이 애플리케이션을 보다 쉽게 확장하고 수정할 수 있습니다.

 

ioc 관련 java class 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class OrderService {
    
    private final InventoryService inventoryService;
    
    @Autowired
    public OrderService(InventoryService inventoryService) {
        this.inventoryService = inventoryService;
    }
    
    public void placeOrder(String productId, int quantity) throws OutOfStockException {
        if (inventoryService.checkAvailability(productId, quantity)) {
            inventoryService.reserve(productId, quantity);
            // ... continue with order processing
        } else {
            throw new OutOfStockException(productId);
        } 
    }
}

InventoryService 클래스에 대한 종속성이 있는 OrderService 클래스가 있습니다. InventoryService는 OrderService의 인스턴스를 생성할 때 InventoryService의 인스턴스를 제공하도록 Spring IoC 컨테이너에 알리는 @Autowired 주석을 사용하여 OrderService에 주입됩니다.

OrderService는 InventoryService를 사용하여 제품의 가용성을 확인하고 재고가 있는 경우 예약합니다. 

IoC를 사용하면 OrderService는 InventoryService 자체의 인스턴스를 생성하거나 수명 주기를 관리할 필요가 없습니다. 

대신 이러한 책임을 처리하기 위해 Spring IoC 컨테이너에 의존합니다.

OrderService 클래스의 @Component 주석은 Spring IoC 컨테이너에게 이 클래스의 인스턴스를 빈으로 생성하고 관리하도록 지시합니다. Spring 프레임워크에서 Bean을 선언하는 방법 중 하나이다.

반응형

Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

 

스프링부트에서 Swagger 를 사용하기 위해 pom.xml 에 dependency 추가하고 

<!-- Swagger 2 -->
<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-swagger2</artifactId>
	<version>2.9.2</version>
</dependency>
	
<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-swagger-ui</artifactId>
	<version>2.9.2</version>
</dependency>

루트패키지 하위에 SwaggerConfiguration 클래스 생성하고 

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

	@Bean
	public Docket api() {
		return new Docket(DocumentationType.SWAGGER_2)
				.apiInfo(apiInfo())
				.select()
				.apis(RequestHandlerSelectors.basePackage("루트.패키지")) // 패키지 범위 설정
				.paths(PathSelectors.any())
				.build();
	}

	private ApiInfo apiInfo() {
		return new ApiInfoBuilder()
				.title("API TEST with Swagger")
				.description("설명")
				.version("1.0.0")
				.build();
	}
}

실행했더니 오류가 났다... 하라는대로 했는데...

Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

 

열심히 구글링 해보니깐, 스프링부트 버전 변경으로 인해 몇몇 라이브러리에서 오류가 발생한다고 한다

Spring boot 2.6버전 이후에 spring.mvc.pathmatch.matching-strategy 값이 ant_apth_matcher에서 path_pattern_parser로 변경되면서 몇몇 라이브러리에서 오류가 발생함

오류처리 방법은 간단하다. application.properties에 설정값 하나만 추가해주면 된다.

# application.properties 사용시
spring.mvc.pathmatch.matching-strategy=ant-path-matcher


# application.yml 사용시
spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

 

추가 해주고 다시 재실행!! 

이상없이 정상적으로 실행되는걸 확인할수 있다.

 

반응형

'개발 티끌 팁 > JAVA' 카테고리의 다른 글

스프링 제어 반전(Ioc) 개념  (0) 2023.02.14
자바 스프링 vo 객체 복사  (0) 2022.07.13

 

 

 

 

파이썬(python)에서 숫자 3자리(천 단위)마다 콤마(,) 넣기는 3가지 방법이 있습니다. 

  1.  format() 
  2. 문자열 format
  3. f-string

1. format() 함수 활용 하여 콤마 넣기

    format(num, ',') 은 3자리마다 콤마를 넣어줍니다.

int_num = 10000000          # 정수형
float_num = 10000000.1001   # 실수형

print(format(int_num, ','))   #10,000,000
print(format(float_num, ',')) #10,000,000.1001

 

2. 문자열 format 활용 하여 콤마 넣기

    문자열 format 을 "{0:,}".format(숫자) 형식으로 작성하면 숫자 3자리 마다 콤마를 넣어 줍니다.

int_num = 10000000          # 정수형
float_num = 10000000.1001   # 실수형

print('{0:,}'.format(int_num))   #10,000,000
print('{0:,}'.format(float_num)) #10,000,000.1001

 

3. f-string 활용 하여 콤마 넣기

    f-string 포맷으로 f'{숫자:,}' 형식으로 작성하면 숫자 3자리 마다 콤마를 넣어 줍니다.

int_num = 10000000          # 정수형
float_num = 10000000.1001   # 실수형
 
print(f'{int_num:,}')    #10,000,000
print(f'{float_num:,}')  #10,000,000.1001

 

 

반응형

 

아이패드 사용시 블루투스 키보드를 연결하여 사용하는 경우 기본적으로 화면에는 아이패드 가상 키보드가 보이지 않아 당혹스러울 때가 종종 있네요.
블루투스 키보드가 바로 앞에 있으면 상관없겠지만 침대에 누워서 넷플릭스나 유튜브 볼려고 검색해야 하는데 키보드가 안보입니다. 어디간겨..?

아이패드 키보드 안올라옴

 



설정 >  블루투스 메뉴에서 키보드 연결을 끊어 버리면 되겠지만, 다시 또 연결해야한다는 불편함이 있습니다. 매번 블루투스 키보드를 끊었다가 다시 연결했다가 상당히 귀찮습니다. 이런경우 침착하게 화면 하단에 작은 메뉴바가 있는데, 여기서 [한] 이라는 버튼을 눌러주세요. 현재 자판 언어설정이 영문인 경우 [A] 로 표시됩니다. 여기서 키보드 보기 를 선택하시면 가상 키보드가 바로 올라옵니다.

 

아이패드 키보드 올라옴

 

 

반응형

 

기존 아이폰 유저들은 아이패드 화면캡쳐가 익숙하겠지만 아이폰을 쓰지않고 아이패드만 사용하다보면 화면 캡쳐가 어렵다🤔 3가지 방법이 있다고 하는데 한번 정리 해보았습니다.  

1. 물리버튼을 눌러 화면 캡쳐 하기

아이패드에 물리버튼을 눌러 캡쳐 방법은 홈버튼 유무에 따라 차이가 있습니다. 요즘에 새로나오는 아이패드는 홈버튼이 없이 출시되고 있어요.

  • 홈 버튼 없는 아이패드에서 화면 캡쳐

홈 버튼이 아이패드 같은 경우 아래 그림과 같이 상단 전원 버튼과 음량 버튼 둘중에 하나를 동시에 눌렀다가 빠르게 때면 화면이 캡쳐 되고 화면의 왼쪽 하단에 캡쳐된 이미지가 표시 되고 해당 이미지를 클릭하면 바로 캡쳐 화면 수정이 가능 합니다.

 

  • 홈 버튼이 있는 아이패드 화면 캡쳐

홈 버튼이 있는 구세대 아이패드에서는 아래 그림과 같이 상단 전원 버튼과 홈버튼을 동시에 눌렀다가 때면 화면이 캡쳐 됩니다. 캡쳐 후 마찬가지로 왼쪽 하단에 캡쳐 이미지가 표시 됩니다. 그리고 캡쳐 화면은 사진 앨범에 스크릿샷 으로 이동됩니다.

하지만 이 방법에는 단점이 있으니 아이패드는 핸드폰과 달리 화면이 크기 때문에 한손으로 화면 캡쳐가 거의 불가능 하고 물리 버튼을 누르기 때문에 타이밍 맞지 않으면 화면이 꺼지거나 소리만 키우게 됩니다.😔 또 펜슬이나 다른 작업중일 때 화면 캡쳐 동선도 썩 좋지는 않습니다. 그래서 2번째 방법을 더 자주 이용합니다.


 

2. 애플펜슬로 아이패드 화면 캡쳐 하기

아이패드를 더욱 효율적이고 다채롭게 사용할수 있게 해주는 애플펜슬만 있다면 아이패드 종류에 상관없이 가장 간편하게 화면 캡쳐 방법이 있습니다. 애플펜슬로 아이패드 화면 외쪽 하단 모서리에서 오르쪽 상단으로 ↗️ 약 45도 방향으로 쓸어주기만 하면 화면이 바로 캡쳐 됩니다.

그림에 화살표 방향으로 쭉 당겨주시면 화면이 캡쳐 됩니다. 애플펜슬로 작업중일 때 불필요한 동작없이 한손으로도 간단하게 아이패드 화면 캡쳐를 할수있기때문에 가장 추천하는 화면 캡쳐 방법 입니다. 단! 애플펜슬이 있어야만 가능합니다. 그냥 손가락으로 열심히 땡겨봤자 화면은 캡쳐되지 않습니다. 그러면 펜슬도 없고 물리버튼도 고장난 상태라면 어떻게 해야 할까요ㅠ


3. 어시스티브 터치(Assistive Touch)로 화면 캡쳐 하기

마지막으로 애플펜슬도 없고 물리버튼도 고장난 경우 화면 캡쳐 하는 방법이 있습니다. 애플에서 기본 제공하고 있는 어시스티브 터치(AssistiveTouch)를 이용하여 화면을 캡쳐하는 방법 입니다. 어시스티브 터치는 화면 터치에 불편함있거나 추가 기능이 필요한 경우 보조메뉴를 사용할수 있는 가상의 터치 버튼을 만들어주는 기능입니다.

설정 > 손쉬운 사용 > 터치 >  AssistiveTouch


해당 설정 메뉴로 들어 왔으면 어시스티브 터치를 켜주시면 화면에 홈버튼 처럼 생긴 소프트 버튼이 생깁니다. 기본 기능이 셋팅 되어 있는데 여기에 화면캡쳐(스크린샷)을 추가 해주시면 됩니다.


스크린샷을 추가 하기 위해서 어시스티브 터치 메뉴에서 두번째에 있는 상위 레벨 메뉴 사용자화를 들어가 줍니다. 해당 메뉴에서 어시스티브 터치 기능을 원하는대로 셋팅이 가능합니다. 변경 하고자 하는 기능을 선택하여 해당 기능을 스크린샷으로 변경해줍니다. 이렇게 설정 해놓으면 물리버튼이 고장나도 애플펜슬이 없어도 언제 어디서든 손쉽게 아이패드 화면 캡쳐가 가능합니다.

 


추가적으로 어시스티브 터치메뉴에 사용자 설정 동작에서 버튼을 눌렀을때 동작을 설정 할수 있는데요. 여기서 이중 탭(두번 클릭) 했을 때 화면이 캡쳐 되게 설정 할수도 있습니다. 아래그림과 같이 설정하고 어시스티브 터치 버튼을 두번 누르게 되면 화면이 바로 캡쳐 됩니다.


사용하기 편한 방법으로 아이패드 화면 캡쳐 해보세요. 저는 애플펜슬이 있어 2번째 방법이 편하네요🤔

 

반응형

'일상' 카테고리의 다른 글

아이패드 키보드 안올라옴  (0) 2022.08.04
아이패드 배터리 성능 효율 확인 방법  (0) 2021.09.23

클래스간에 프로퍼티 복사
set으로 하나씩 하나씩 하기에는 귀찮음

스프링에서 제공하는 API 사용 하자

BeanUtils.copyProperties(source, target);
source : 원본 객체
target :  복사 대상 객체

BeanUtils.copyProperties(source, target, String ... ignoreProperites);
source : 원본 객체
target : 복사 대상 객체
ignoreProperities : 복사를 원하지 않는 프로퍼티명





반응형

 

자바스크립트 some(), indexOf(), lastIndexOf() 을 이용한 배열 중복 체크

화면단에서 유효성체크 작업중 배열에 값이 중복 값이 들어있는지 확인해야할 일이 생겼다.
정통적인 방법인 for문 돌려 체크하는 방법도 있지만, 이제 조금 세련된 방법으로 중복체크를 해보자

언제까지 for문만 돌릴껀가!!

일단 3가지 자바스크립트 함수에 대해 알아야 한다. 

 

1. some() 함수 

array.some(function(currentValue, index, arr), thisValue)

/*예시*/
const ages = [3, 10, 18, 20];
function checkAdult(age) {
  return age >= 18;
}
ages.some(checkAdult)   // Returns true

some() 함수는 callback이 참을 반환하는 요소를 찾을 때까지 배열에 있는 각 요소에 대해 한 번씩 callback 함수를 실행하여, 해당하는 요소를 발견한 경우 즉시 true를 반환하는 함수 입니다. 찾지 못하면 false 를 반환 합니다. 

https://www.w3schools.com/jsref/jsref_some.asp

 

JavaScript Array some() Method

JavaScript Array some() Example Check if any values in the ages array are 18 or over: const ages = [3, 10, 18, 20]; ages.some(checkAdult)   // Returns true function checkAdult(age) {   return age >= 18; } Try it Yourself » More "Try it Yourself" exam

www.w3schools.com

 

2. indexOf()

array.indexOf(item, start)

/*예시*/
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.indexOf("Apple")   // Returns 2

indexOf() 함수는 배열 안에서 찾으려는 값과 정확하게 일치 하는 '첫번째' 값의 index를 반환 합니다. 

https://www.w3schools.com/jsref/jsref_indexof_array.asp

 

JavaScript Array indexOf() Method

JavaScript Array indexOf() Example Search an array for the item "Apple": const fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.indexOf("Apple")   // Returns 2 Try it Yourself » More "Try it Yourself" examples below. Definition and Usage The ind

www.w3schools.com

3. lastIndexOf() 

array.lastIndexOf(item, start)

/*예시*/
const fruits = ["Apple", "Orange", "Apple", "Mango"];
fruits.lastIndexOf("Apple") // Returns 2

lastIndexOf() 함수는 배열 안에서 찾으려는 값과 정확하게 일치 하는 '마지막' 값의 index를 반환 합니다. 

https://www.w3schools.com/jsref/jsref_lastindexof_array.asp

 

JavaScript Array lastIndexOf() Method

JavaScript Array lastIndexOf() Example Search an array for the item "Apple": const fruits = ["Apple", "Orange", "Apple", "Mango"]; fruits.lastIndexOf("Apple")   // Returns 2 Try it Yourself » More "Try it Yourself" examples below. Definition and Usage

www.w3schools.com

 

이 세 가지 함수를 조합하면 배열의 중복 값 여부를 체크할 수 있습니다.

var arr = ['a', 'b', 'c', 'a'];

function isDup(arr)  {
  return arr.some(function(x) {
    return arr.indexOf(x) !== arr.lastIndexOf(x);
  });  
}

var result = isDup(arr);

document.writeln(result);

1. some() 함수로 배열 arr의 값을 순서대로 callback 함수로 전달 하여 실행 arr.some(function(x) {});

2. 배열에서 x값의 index를 indexOf() 와 lastIndexOf() 로 확인 하여 같지 않으면 true 리턴 

   return arr.indexOf(x) !== arr.lastIndexOf(x);

   배열의 x값의 중복이 없다면 두 index 값은 동일 : false

                     중복이 있다면 두 index 값은 다름 : true

3.  some() 함수의 callback 함수는 중복이 존재하면 true를 리턴하고, 중복이 존재하지 않으면 false를 리턴

 

some() 함수를 이용하면 for문을 돌려서 체크 하는것보다 더 깔끔하고 세련되게 코드를 짤수 있다.

반응형

아이패드 중고거래시 필수 체크 항목이죠. 배터리 효율!!!

중고로 살때나 팔때나 배터리 효율은 100%에 가까울수록 좋습니다. 가격을 좀 더 받을수도 있고요.

 

 

1. 아이패드 내부 로그 기능을 활용하여 배터리 효율 확인하는 방법

아이패드 내부 로그 기능을 활용하면 별도의 프로그램 설치없이 배터리 성능을 확인할수 있습니다. 이방법은 윈도우PC가 없거나 MAC만 사용하시는 분, 프로그램 설치가 귀찮으신 분들에게 그리고 시간적 여유가 있으신분들에게 추천합니다. 

배터리 성능을 기기에서 직접 측정하기 때문에 더 정확하다는 소리도 있습니다.

 

  • 설정 => 개인 정보 보호 => 분석 및 향상 으로 들어가 주세요

  • 상단에 iPad 분석 공유를 활성화 해주세요. 활성화 후 하루(24시간)정도 지난 뒤에 배터리 성능 확인 가능합니다.  하루가 지나면 분석데이터에 아이패드 로그가 쌓이기 시작합니다. 

 

  • 분석 데이터에서 log-aggregated 파일 을 찾아 주세요. log-aggregated 라는 이름을 가진 ips 파일 중 측정하는 전날의 파일을 열주세요. ex) 2021-09-23 측정 => log-aggregated-2021-09-22-091110.ips

  • 분석된 로그 정보를 전부 복사하여 텍스트 편집기에 붙여 넣어주세요. 복사후 기본 메모 어플을 열어 복사한 내용을 붙여넣어 주세요. 

  • 메모 앱에서 메모에서 찾기 를 눌러주시고 검색창에 아래 내용을 검색해주세요.
- battery.CycleCount :  아이패드 배터리 충전 횟수 
                                아이패드 평균 배터리 수명 사이클 수는 1,000회 정도 라고 합니다. 
- battery.MaxumumCapacityPercent : 아이패드 배터리 최대 성능 수치 

 

아이패드는 배터리 충전 횟수 56회 / 배터리 성능 : 100% 로 아직까지는 배터리 성능이 짱짱하네요. 근데 요즘 아이패드 신제품 발표로 중고값이 떨어져서... ㅠㅠㅠㅠㅠㅠ 

 

 

2. PC를 통해 배터리 효율 확인하는 방법( 3uTools )

PC에 3uTools라는 프로그램을 설치하고 아이패드를 PC와 연결하여 배터리 성능을 확인하는 방법 입니다. 아이패드 내부 로그를 기다리기 귀찮으신분, 윈도우 PC가 있으신분들에게 추천합니다. 

3uTools : http://www.3u.com/

 

3uTools | The best all-in-one tool for iOS users

The Most Efficient iOS Files & Data Management Tool 3uTools makes it so easy to manage apps, photos, music, ringtones, videos and other multimedia files. Fully view iOS device' s different statuses, including activation, jailbreak, battery and iCloud lock

www.3u.com

사이트에 접속하시면 메인 화면에 Download 버튼이 보이는데, 해당 버튼을 눌러 3uTools를 다운받고 설치해주세요. 

 

  • 설치가 완료 되었으면 PC와 아이패드를 연결해주세요.
  • iDevice 메뉴에서 Info 메뉴를 선택해 주세요.
  • Charge Times 와  Battery Life 를 수치를 확인하세요.
  • Details 를 클릭하면 더 자세한 내용을 확인 가능합니다.

 

 

반응형

'일상' 카테고리의 다른 글

아이패드 키보드 안올라옴  (0) 2022.08.04
아이패드 애플펜슬 화면 캡쳐(스크린샷) 방법  (0) 2022.08.04

There is no statement named [DB 맵핑] in this SqlMap

There is no statement named [DB 맵핑] in this SqlMap 오류는 종종 발생하는데, 대부분의 원인은 쿼리호출 id 오타가 많다.

대소문자 구분좀..

There is no statement named 에러 발생시 아래 3가지 사항을 확인해주세요.

 


1. 쿼리문이 저장되어있는 XML의 ID 확인
<select id="
쿼리id" parameterClass="hashmap" resultClass="hashmap">

2. Java 파일에서 쿼리문 호출 ID 확인
select("
쿼리id", map);

3. sqlMapConfig.xml 파일에 등록 여부 확인
쿼리문을 등록하는 xml 파일에 쿼리문 xml이 등록되어있는지 확인

 


오타나 설정 하나로 몇시간씩 삽질하지 않기를 바랍니다~

반응형

1. 설치 

- Anaconda3 5.x 64비트 버전 설치 (파이썬 3.6 포함)


2. 텐서플로 설치 

- GPU가 없어 CPU 버전으로 ㅠㅠ 

- Anaconda Prompt 관리자 권한으로 실행 

- pip install tensorflow 입력 - 자동으로 설치됨


3. 설치확인 

import tensorflow as tf


print("tf.test.is_built_with_cuda():", tf.test.is_built_with_cuda())

print("tf.test.is_gpu_available():", tf.test.is_gpu_available())


# Undocumented feature

from tensorflow.python.client import device_lib as _device_lib

print(_device_lib.list_local_devices())



4. 결과

tf.test.is_built_with_cuda(): False

tf.test.is_gpu_available(): False

[name: "/device:CPU:0"

device_type: "CPU"

memory_limit: 268435456

locality {

}

incarnation: 14260437998891284931

]

반응형

+ Recent posts