본문 바로가기

전체 글241

스프링 부트에서 JSP 파일 못 찾는 이슈 해결 과정 김영한 선생님의 강의를 보던 중이었다. 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의에서 'JSP로 회원 관리 웹 애플리케이션 만들기' 부분이다. 관련 내용: https://www.inflearn.com/questions/626836 당시 static 폴더에 index.html과 basic.html을 둔 상태로 jsp/members 폴더를 만들고 new-form.jsp 부분을 작성했다. 문제는 jsp 파일에서 404(not found) 이슈가 발생했다. 김 선생님께서 올려주신 프로젝트 파일을 토대로, application.properties 파일을 업데이트하고 webapp 폴더 구조, jsp 디펜던시 추가 등 다양한 작업을 했으나 여전히 동작하지 않았다. 버전이 문제인가 싶어서 spring 버전.. 2023. 7. 29.
[Spring] 변경 감지와 병합(merge) 상품 수정 실행 상품 수정 폼 HTML에는 상품의 id(hidden), 상품명, 가격, 수량 정보 있음 1. 상품 수정 폼에서 정보를 수정하고 Submit 버튼을 선택 2. /items/{itemId}/edit URL을 POST 방식으로 요청하고 updateItem() 메서드를 실행 3. 이때 컨트롤러에 파라미터로 넘어온 item 엔티티 인스턴스는 현재 준영속 상태다. 따라서 영속성 컨텍스트 의 지원을 받을 수 없고 데이터를 수정해도 변경 감지 기능은 동작X @PostMapping("items/{itemId}/edit") public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form) { Book boo.. 2023. 7. 25.
안드로이드 BLE 통신(공식문서 번역) 3 BLE Characteristics 정보 읽기 일단 GATT 서버에 앱이 연결되어 서비스를 찾으면, attributes를 읽을 수 있다. 스니펫에서는 서버의 서비스들과 characters를 순회하고 UI에 띄운다. public class DeviceControlActivity extends Activity { ... // Demonstrates how to iterate through the supported GATT // Services/Characteristics. // In this sample, we populate the data structure that is bound to the // ExpandableListView on the UI. private void displayGattServi.. 2023. 7. 23.
안드로이드 BLE 통신(공식문서 번역) 2 GATT callback 선언 일단 서비스가 기기에 연결되면 BluetoothGattCallback을 통해 연결 상태에 대한 알림을 받는다. 서비스 회복, Characters read, Characters notifications onConnectionStateChanged 메소드는 디바이스의 GATT 서버 연결이 변경되었을 때 호출된다. 서비스 클래스에 선언되어 bluetoothAdapter 와 함께 사용될 수 있다. (서비스와 연결된 이후에) private final BluetoothGattCallback bluetoothGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothG.. 2023. 7. 23.
안드로이드 BLE 통신(공식문서 번역) 1 작성: 2023년 7월 21일 https://developer.android.com/guide/topics/connectivity/bluetooth/ble-overview 일반적인 블루투스과 다르게 저전력 사용을 목적으로 한다. 예) 접근 센서, 심장 맥박 측정기, 피트니스 디바이스 등 BLE 필요 권한(manifest) https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#java 블루투스 지원 여부 확인 boolean bluetoothAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); 블루투스 BLE 여부 확인 bool.. 2023. 7. 23.
[Spring] 컴포넌트 스캔 컴포넌트 스캔과 의존관계 자동 주입 1. 스프링은 AppConfig를 만들어서 @Bean 어노테이션을 주는 방식이 아닌, 컴포넌트 스캔 방식을 제공한다. 2. 의존관계를 자동으로 주입하는 @Autowired 기능을 제공한다. 3. @Component 어노테이션을 클래스에 붙이면 Bean 객체로 할당이 된다. AutoAppConfig.java package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import.. 2023. 7. 16.
[Spring] 싱글톤 컨테이너 웹 어플리케이션과 싱글톤 1. 스프링은 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 2. 스프링은 주로 웹 개발에 사용된다. 3. 여러 클라이언트의 요청을 받기 때문에 싱글톤 패턴을 이용한다. 만약 1초에 100개의 요청들이 들어온다면? 100개의 객체를 생성해야 할까? 1개의 객체만 생성하고 클라이언트 요청에 따라 돌려쓰는 방안이 필요하다. => 싱글톤 사용 싱글톤 코드 package hello.core.singleton; public class SingletonService { //1. static 영역에 객체를 딱 1개만 생성해둔다. private static final SingletonService instance = new SingletonService(); //2. public으로 열.. 2023. 7. 16.
[Spring] 스프링 컨테이너와 스프링 빈 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext를 스프링 컨테이너라고 한다. ApplicationContext는 인터페이스이다. 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다. AppConfig 클래스를 만들었던 것이 어노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다. *스프링 컨테이너를 부를 때, BeanFactory, ApplicationContext로 구분해서 이야기한다. BeanFactory를 직접 사용하는 경우는 거의 없으므로 일반적으로 ApplicationCont.. 2023. 7. 14.
[Spring] 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 새로운 할인 정책이 추가된다면, Service내의 Policy를 다시 할당해야 한다. // private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); 다형성을 활용하고 인터페이스와 구현 객체를 분리했다. 하지만 OCP, DIP원칙을 지키고 있지 않다. 클라이언트 코드 자체를 수정했으므로 OCP 원칙에 어긋난다. 인터페이스를 참조하지만 구현 클래스에도 의존하고 있으므로(RateDiscountPolicy) DIP 원칙에 어긋난다. 이러한 문제를 해결하기 위해 AppConfig클래스를 만들어 원하는 할인 정책 및 저.. 2023. 7. 14.
[Spring] 스프링 핵심 원리 이해1 - 예제 만들기 회원 회원 회원을 가입하고 조회할 수 있다. 회원은 일반과 VIP 두 가지 등급이 있다. 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정) => MemberRepository 인터페이스를 만들어서 처리한다. 주문과 할인 정책 주문과 할인 정책 회원은 상품을 주문할 수 있다. 회원 등급에 따라 할인 정책을 적용할 수 있다. 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 될 수 있 다.) 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다. (미확정) => 할인 정책 인터페이스 구현체가 1개밖에 없는 경우 ~Imp.. 2023. 7. 13.
[Spring] 객체 지향 설계와 스프링 객체 지향 설계와 스프링 1. 스프링은 다음 기술로 다형성 + OCP, DIP를 가능하게 지원한다. DI(의존성 주입) DI 컨테이너 2. 클라이언트 코드의 변경 없이 기능 확장 3. 쉽게 부품을 교체하듯이 개발 스프링 프레임워크는 OCP, DIP 원칙을 지키면서 개발하다보니 만들어졌다. 정리 1. 모든 설계에 역할과 구현을 분리하자. 2. 공연을 설계 하듯이 배역만 만들어두고, 배우는 언제든지 유연하게 변경할 수 있도록 만드는 것이 좋다. 3. 이상적으로는 모든 설계에 인터페이스를 부여하자. 할인 정책에 대한 인터페이스를 만들어 놓고 나중에 수정하는 방식으로 간다. 실무 고민 1. 인터페이스를 도입하면 추상화라는 비용이 발생한다. 2. 기능을 확장할 가능성이 없다면, 구체 클래스를 직접 사용하고 향후 .. 2023. 7. 12.
[Spring] 좋은 객체 지향의 5가지 원칙(SOLID) SRP 단일 책임 원칙 Single Responsibility Priciple 1. 한 클래스는 하나의 책임만 가져야 한다. 2. 하나의 책임이라는 것은 모호하다. 클 수 있고, 작을 수 있다. 문맥과 상황에 따라 다르다. 3. 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이다. 예) UI변경, 객체의 생성과 사용을 분리 OCP 개방 폐쇄 원칙 Open/Closed Principle 1. 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 2. 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현한다. 문제점 MemberRepository m = new MemoryMemberRepository(); // 기존 코드 MemberR.. 2023. 7. 12.
[Spring] 좋은 객체 지향 프로그래밍이란? 추상화, 캡슐화, 상속, 다형성 객체 지향 프로그래밍이란? 1. 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고 받고, 데이터를 정리할 수 있다. (객체들의 모임이 메시지를 주고 받으며 협력한다.) 2. 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 하므로 대규모 소프트웨어 개발에 많이 사용된다. 다형성이란? 역할(인터페이스)과 구현(인터페이스를 상속받은 객체) 자동차 역할 - K3, 아반떼, 테슬라 모델3 등 자동차가 바뀌어도 운전자는 운전을 할 수 있다. 왜? 자동차의 인터페이스에 맞추어 개발을 했기 때문이다. K3전용 운전면허? 아반떼 전용 운전면허? No 자동차 세계를 무한.. 2023. 7. 12.
[Spring] 스프링이란? 스프링이란? 스프링은 스프링 기술들의 모임이다. 스프링 프레임워크, 스프링 부트, 스프링 데이터, 스프링 세션.. 등 스프링 프레임워크 핵심 기술: 스프링 DI 컨테이너, AOP, 이벤트, 기타 웹 기술: 스프링 MVC, 스프링 WebFlux 데이터 접근 기술: 트랜잭션, JDBC, ORM 지원, XML 지원 기술 통합: 캐시, 이메일, 원격접근, 스케줄링 테스트: 스프링 기반 테스트 지원 언어: 코틀린, 그루비 스프링부트 스프링을 편리하게 사용할 수 있도록 지원하는 기술, 최근에는 기본으로 사용된다. 1. Tomcat 같은 웹서버를 내장하여 별도의 웹서버를 설치하지 않아도 된다. 2. 손쉬운 빌드 구성을 위한 starter 종속성 제공 3. 3rd party 라이브러르 자동구성 4. 메트릭, 상태 확인.. 2023. 7. 12.
[Android] 사이닝 처리 하기 윈도우 기준 keytool -genkey -v -keystore jks파일을 만들 경로/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias 앨리어스키 주로 android 폴더 내에 app에다가 jks 파일을 만든다. alias파일과 비밀번호는 동일하게 설정한다. 1. jks파일을 만든 이후에 android프로젝트 폴더에 key.properties 파일을 만든다. storePassword=스토어 패스워드 keyPassword=패스워드 keyAlias=앨리어스 storeFile=jks파일이름.jks 2. app build.gradle 폴더에서 다음과 같이 처리한다. 전역으로 선언 // Create a variable called keystoreProperti.. 2022. 12. 9.
[Flutter] 스크롤뷰 하단부터 위젯 배치 CustomScrollView( slivers: [ SliverFillRemaining( hasScrollBody: false, child: Column( children: [ const Text('Header'), Expanded(child: Container(color: Colors.red)), const Text('Footer'), ], ), ), ], ) SingleChildScrollView를 사용하고 내부에 Expanded위젯을 사용하는 경우에는 스크롤뷰의 크기가 정해져 있어야 사용할 수 있다. 그래서 SizedBox위젯을 사용하여 사이즈 설정 후에 사용하는 경우도 있는데, 문제는 이러면 내부 영역이 고정되어 버린다. 이러한 경우에 CustomScrollView를 사용하여 스크롤뷰 내부에서도 .. 2022. 11. 4.
[Flutter] Visibility와 Opacity 차이 Visibility의 경우에는 해당 위젯이 눈에 보이는지 아예 보이지 않는지에 대한 처리를 한다. (영역을 차지하지 않는다.) Opacity의 경우에는 해당 위젯이 얼만큼 보이는지 opacity값을 조절한다. (영역을 차지한다.) Visibility(visible: true, child: Container()) Opacity(opacity: 1, child: Container()) Flutter로 개발함에 있어서 위의 내용만 이해를 한다면 클릭 이벤트에서 문제가 생길 여지가 있다. 특정 물체에 클릭 이벤트를 주고 싶은 경우에 GestureDetector를 이용하는데, Visibility로 감싼 위젯의 경우에는 false 상태에서 이벤트를 받지 않지만, Opacity로 감싼 위젯의 경우에는 opacity .. 2022. 11. 4.
[Flutter] Flavor 처리(New Version) Flutter Flavor 처리(Old version) https://kymworld.tistory.com/70 Flavor 처리를 적용하다 Flutter에서 Flavor 시스템을 구축하는 방법에 대해서 조사를 했고 실제로 Android에서는 Flavor, IOS에서는 scheme 정보를 추가하여 flutter의 --flavor 명령어를 사용하여 정상적으로 동작하는 것을 확인했습니다. 이러한 방식은 다음 블로그의 내용을 참고하여 작업을 했으며 BuildConfig에 대한 다트 코드 및 main문에 대한 분기 처리를 제외하고는 동일한 방식으로 개발이 되었습니다. Flavor를 통한 빌드 변형 — PART#1 (안드로이드 사이드) Flavor를 통한 빌드 변형 — PART#2 (iOS 사이드) Flavor를.. 2022. 6. 20.
[WebRTC] Real time communication with WebRTC 4 https://codelabs.developers.google.com/codelabs/webrtc-web/#6 7. Set up a signaling service to exchange messages In this step, you'll find out how to: Use npm to install project dependencies as specified in package.json Run a Node.js server and use node-static to serve static files. Set up a messaging service on Node.js using Socket.IO. Use that to create ‘rooms' and exchange messages. Node.js, .. 2022. 6. 19.
[Flutter] Provider 성능 최적화 Flutter의 provider라는 패키지를 사용하여 프로그램을 개발하고 있었는데, 어플 실행시 CPU점유율이 너무 높고 발열이 심한 이슈가 있어서 성능 최적화 작업을 진행하게 되었습니다. 개발과정에서도 어플이 느리긴 했는데 디버그 모드 생각해서 크게 이슈라고 생각하지 않았다가 릴리즈 모드에서 성능이 너무 안 좋아서.... ㅠ 개선 방향성 - 모든 화면에 대한 build함수 호출을 줄이는 방향 - rebuild가 필요하더라도 최소한의 리소스를 사용하는 방향(캐싱) Android Native 앱을 프로파일링 했을 때 CPU점유율이 어느 정도 되는지 비교하고 비슷한 수준으로 맞추거나 더 빠르게 만드는 것을 목표로 하고 개선 작업을 진행했습니다. 테스트 내역(Native 수준으로 빨라질 수 있는가?) 더보기 .. 2022. 6. 12.