728x90

1, Spring 소개

 

https://www.youtube.com/watch?v=XtXHIDnzS9c&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=1

 

 

2. 느슨한 결합력과 인터페이스

 

 

3. DI(Dependency Injection)

 

4. IoC(Inversion Of Control) 컨테이너

 

 

결합력이 강한 경우에는 A가 만들어지면 B가 만들어지고 C,D까지 만들어지는 순서임. 

그러나 이와 달리 역순으로 D부터 A까지 객체를 만든 후에 조립되는 컨테이너라는 의미로 IoC Container라고 함.

 

 

5. Dependency를 직접 

 

7. 스프링 DI 지시서 작성하기(Spring Bean Configuration)

 

8. 스프링 IoC 컨테이너 사용하기(ApplicationContext 이용하기)

 

종류가 여러개인 이유는, 지시서(config파일)의 위치를 어떻게 알려주느냐에 따라서 달라짐

1) 어플리케이션의 root에서부터 경로를 알려줄때는 classPathXml~.

2) C드라이브(파일시스템)의 어느 경로에 있다고 알려줄때는 FileSystemXml~.

3) config 파일을 웹의 경로에 두고 있다고 URL로 알려줄 때는 XmlWeb~.

4) Annotation을 이용할 경우에는 AnnotationConfig~.

 

 

 

+Java Project일 때 Maven Project로 바꾸고 싶을 경우

 

11. 콜렉션 생성과 목록DI

 

방법1

 

 

방법2

 

 

12. 어노테이션을 이용할 때의 장점과 @Autowired를 이용한 DI 해보기

 

초기에 xml로 설정을 할 때, 코드를 건드리지 않고, xml만으로 객체를 B2에서 B3로 바꿀 수 있다는 것 자체만으로도 좋았지만, 나중에는 이 변경에 따른 것 마저 자동으로 바뀌었으면 하고 바라게 됨.

따라서 설정하는 코드에 annotation을 붙여서 바뀌도록 하게함.

즉, xml 방식은 설정을 코드와 분리하는 방식

annotation 방식은 설정을 코드와 같이 가져가는 방식

 

 

이전에 xml방식에서 property로 설정해서 injection하던 방식 ==> annotation에서는 @Autowired로 대체 가능

 

 

13. @Autowired의 동작방식 이해와 @Qualifier 사용하기

 

같은 클래스의 객체가 두개 이상일 경우는 @Autowired로 자동매칭이 되지 않음 (어떤 객체를 해야할지가 문제가 되기 때문). setter에 있는 객체명 파라미터와 같으면 자동매칭 되긴함. 하지만 이보다는 직접적으로 객체의 id를 통해 '이 객체와 연결하라'고 매칭해주는 것이 좋음. 이 때 쓰는 annotation이 @Qualifier임. 

 

 

14. @Autowired의 위치와 required 옵션

 

@Autowired는 setter위에도 사용 가능하고.

 

 

 

@Autowired는 기본 객체 생성자 위에도 사용 가능하고

 

 

@Autowired는 overload 생성자 위에서도 사용 가능함

 

 

이럴경우 overload 생성자는 있는데, 기본생성자가 없기 때문에 에러가 발생함

단, overload생성자도 없으면 에러 미발생

 

 

overload 생성자에 붙일 경우, 그냥 붙이면 에러가 발생할 수 있는데, 이유는 overload 생성자에서는 입력하려는 동일유형 객체가 여러개일 수 있기 때문. 따라서 파라미터 자리별로 @Qualifier로 지정할 수 있음.

 

 

만약, @Autowired로 자동으로 객체를 연동하게끔 코드가 작성되어 있어도, 객체를 생성하지 않을 수 있음. 이런 상황에서도 소스가 null인 상태로라도 작동이 되게끔 구현하고 싶다면, 다음과 같이 @Autowired(required = false)를 지정하면 됨

 

https://www.youtube.com/watch?v=MlTk1AFMIzU&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=14

728x90
728x90

[현상]

1. 나는 2개의 Calendar 객체를 각기 다르게 셋팅해서, 두 객체를 after 메소드로 비교하려고 했다.

2. A 객체는 SimpleDateFormat을 사용하여 setTime()로 날짜를 설정했고

3. B 객체는 set()만 사용하여 날짜를 설정하려고 했다.

 

한마디로 아래와 같은 상황인데

    Calendar calendarA = Calendar.getInstance();
    calendarA.set(year, monthOfYear, dayOfMonth, 0, 0, 0);

    Calendar calendarB = Calendar.getInstance();
    calendarB.setTime(dateformat.parse(specificDateStr));
    calendarB.set(Calendar.HOUR_OF_DAY, 0);
    calendarB.set(Calendar.MINUTE, 0);
    calendarB.set(Calendar.MILLISECOND, 0);

    if (calendarA.after(calendarB)) {
    	//비교했을 때 수행하려는데... 문제는...	
    }

 

예를 들어 오늘이 2019-09-20일 때,

calendarA는 2019-09-18로 설정하고, calendarB는 2019-09-19로 설정하려고 한다면,

after()메소드로 두 객체를 비교하려는 부분에서

calendarB는 19일이지만, A는 20일로 getInstance했을때의 초기값인 오늘로 설정된다는 것이었다.

 

DatePickerDialog를 쓰려고 하다보니 DateSet에서는 int값3개인데 굳이 그걸 또 setTime()으로 쓰기엔 번거로운 면이 있어서

set() 메소드를 써야하는데 이런 결과를 주니까 ?????인 상태

 

    Calendar calendarA = Calendar.getInstance();
    calendarA.set(year, monthOfYear, dayOfMonth, 0, 0, 0);
    calendarA.getTime(); // 어째서인지 강제로 업데이트해주는 식으로 getTime()메소드를 해줘 갱신되었다

    Calendar calendarB = Calendar.getInstance();
    calendarB.setTime(dateformat.parse(specificDateStr));
    calendarB.set(Calendar.HOUR_OF_DAY, 0);
    calendarB.set(Calendar.MINUTE, 0);
    calendarB.set(Calendar.MILLISECOND, 0);

    if (calendarA.after(calendarB)) {
    	//비교했을 때 수행하려는데... 문제는...	
    }

 

그래서 디버깅 연결하면서 로그를 찍어보려고, 위처럼 한번 getTime()을 했더니, 갱신이 되었다.

원래 이렇게 써야했던건가..? 내가 기초가 부족했던건가??? 싶어서 멘붕이 왔는데,

나와 같은 아래의 질문을 가진 사람과 답변이 있는 stackoverflow QnA를 발견...

직렬화 어쩌고 버그같은데...

 

https://stackoverflow.com/questions/1407007/is-calling-javas-calendar-gettime-necessary-to-update-the-object

 

Is calling Java's Calendar.getTime() necessary to update the object?

I came across a comment in some java code that states that getTime() needs to be called to update the Calendar object. Is this true? I cannot find anything that says that this is necessary. Here's...

stackoverflow.com

728x90

'Dev > Java' 카테고리의 다른 글

RxJava 이해  (0) 2020.02.03
[Java] Java SE, EE, ME, FX의 차이  (0) 2019.10.16
[Java] Singleton Pattern 사용시  (0) 2018.10.02
728x90

2019/09/02 - [Dev/Android] - [Android] 데이터 바인딩 개념 및 라이브러리 비교(Android Data Binding Library, Kotlin Android Extensions)

 

 

안드로이드 앱개발 시

데이터바인딩 설정하는건 정말 간단한데, 그것마저도 가끔씩 까먹어서 요약글 적어놓습니다.

 

 

1. build.gradle (app)

1
2
3
4
5
6
7
8
android{
 
  dataBinding {
      enabled = true
  }
 
}
 
cs

 

2. XML layout

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
 
  <data>
        <variable
            name="activity"
            type="패키지경로.MainActivity"/>
 
    </data>
 
 
<LinearLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"/>
 
</layout>
 
cs

 

3. Java

1
2
3
4
5
6
7
8
9
10
MainActivityLayoutBinding databinding;
 
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
   databinding = DataBindingUtil.setContentView(this, R.layout.main_activity_layout);
   databinding.setActivity(this);
 
}
cs

 

 

 

 

 

Reference

 

Android Jetpack:Empower your UI with Android Data Binding

Data Binding Library is a support library that enables you to bind UI elements in your layouts to data sources in your app using a…

medium.com

 

728x90
728x90

1. Singleton Pattern이란?

 

- 싱글톤 패턴은 하나의 프로그램 내에서 하나의 객체만을 사용해야하는 상황에 주로 사용된다.

  (즉, 어플리케이션 전체 영역에서 하나의 클래스의 단 하나의 인스턴스를 생성하는 것)

   환경설정 관리 클래스나 커넥션 풀과 같이 pool 형태로 관리되는 클래스로 주로 공통클래스에 사용되는 것이 일반적이다.

 

 ex. 로그인 시 로그인한 사용자 정보를 처음에만 셋팅하는 UserData가 있다고 가정하자. 로그인 후, 로그아웃될 때까지 단 1번만 셋팅하면 되는 데이터인데, 이를 매번 사용할 때마다 새로운 UserData 객체로 생성하게 된다면, 자원 낭비 또는 참조하는 객체의 위치가 꼬이는 일이 발생할 수 있다.

 

2. Singleton 구현에서 주의 할 점

- 생성자를 private로 생성하여, 다른 외부 클래스에서 싱글톤 클래스를 new로 구성하지 못하게 하는 부분이다.

  싱글톤 클래스의 인스턴스를 타 클래스에서 사용하기 위해서는 getInstance()를 호출해야만 한다. 

 

- Java에서 singleton 멤버변수는 static 이어야한다는 것과 Singleton 클래스의 생성자는 private / protected 이어야한다는 것을 꼭 유념해야한다. private 일 경우는 결코 new 를 이용하여 인스턴스의 중복 생성을 방지하는 셈이기도 하나 상속이 되지 않는다는 단점이 있어 protected로 대게 선언한다.

 

 

 

Reference

http://mkil.tistory.com/199

http://tokisum.tistory.com/8

http://jeong-pro.tistory.com/86

728x90

'Dev > Java' 카테고리의 다른 글

RxJava 이해  (0) 2020.02.03
[Java] Java SE, EE, ME, FX의 차이  (0) 2019.10.16
[Java] Calendar 객체 사용시 'set' not working  (0) 2019.09.19

+ Recent posts