네로개발일기

개발자 네로의 개발 일기, 자바를 좋아합니다 !

'web'에 해당되는 글 82건


반응형

의존성 주입 애노테이션 - @Autowired @Resource @Inject

의존 객체 자동 주입은 스프링 설정 파일에서 <constructor-arg> 또는 <property> 태그로 의존 객체 대상을 명시하지 않아도 스프링 컨테이너가 자동적으로 의존 대상 객체를 찾아 해당 객체에 필요한 의존성을 주입하는 것을 말한다.

이를 구현하는 방법은 @Autowired, @Resource, @Inject 애노테이션 등을 사용하여 구현한다. 

1. @Autowired

@Autowired는 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.

@Autowired는 필드, 생성자, Setter에 붙일 수 있다.

Type => Qualifier => Name

 

1) @Autowired 필드주입

public class UserService {

    @Autowired
    private UserRepository userRepository;
    
    public UserService() {
    }
}

2) @Autowired 생성자 주입

public class UserService {

    private UserRepository userRepository;
    
    @Autowired
    public UserService (UserRepository userRepository) {
    	this.userRepository = userRepository;
    }
}

3) @Autowired Setter 주입

public class UserService {

    private UserRepository userRepository;
    
    public UserRepository() {
    }
    
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
    	this.userRepository = userRepository;
    }
}

4) @Qualifier 애노테이션

XML 설정 파일

<bean id="userRepository1" class="com.user.repository.UserRepository">
	<qualifier value="userRepository"/>
</bean>
<bean id="userRepository2" class="com.user.repository.UserRepository"/>
<bean id="userRepository3" class="com.user.repository.UserRepository"/>

위와 같이 동일한 타입의 빈 객체가 여러개 정의되어 있을 경우 우선적으로 사용할 빈 객체의 <bean> 태그 하위에 <qualifier> 태그를 설정한다.

 

자바코드

public class UserService {

    @Autowired
    @Qualifier("userRepository")
    private UserRepository userRepository;
    
    public UserService() {}
}

자바 코드에서는 @Autowired와 함께 @Qualifier를 사용해서 @Qualifier에 XML 설정파일에서 설정한 <qualifier> 태그의 value 값을 지정해준다.

이렇게 하면 동일한 타입의 빈이 여러 개일 경우 우선적으로 특정 빈이 주입된다.

 

2. @Resource

@Resource는 주입하려고 하는 객체의 이름(id)이 일치하는 객체를 자동으로 주입한다. 

@Resource는 Java가 제공하는 애노테이션이며 필드, Setter에 붙일 수 있지만 생성자에는 붙일 수 없다.

Name => Type => Qualifier

 

1) 의존성 설정

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

프로젝트에서 사용하기 위해 javax.annotation-api 의존성을 추가한다.

 

2) @Resource 필드 주입

import javax.annotation.Resource;

public class UserService {

    @Resource
    private UserRepository userRepository;
    
    public UserService() {}
}

3) @Resource Setter 주입

import javax.annotation.Resource;

public class UserService {

    private UserRepository userRepository;
    
    public UserService() {}
    
    @Resource
    public setUserRepository(UserRepository userRepository) {
    	this.userRepository = userRepository;
    }
}

3. @Inject

@Inject는 @Autowired와 유사하게 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다. 

Type => Qualifier => Name

 

1) 의존성 설정

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

프로젝트에서 사용하기 위해 javax.inject 의존성을 추가한다.

 

2) @Inject 필드 주입

import javax.inject.Inject;

public class UserService {

    @Inject
    private UserRepository userRepository;
    
    public UserService() {}
}

3) @Inject 생성자 주입

import javax.inject.Inject;

public class UserService {

    private UserRepository userRepository;
    
    @Inject
    public UserService(UserRepository userRepository) {
    	this.userRepository = userRepository;
    }
}

4) @Inject Setter 주입

import javax.inject.Inject;

public class UserService {

    private UserRepository userRepository;
    
    public UserService() {}
    
    @Inject
    public void setUserRepository(UserRepository userRepository) {
    	this.userRepository = userRepository;
    }
}

5) @Named 애노테이션

@Autowired의 @Qualifier과 같이 사용할 수 있는 것이 @Inject에서는 @Named이다.

@Qualifier과 달리 @Named에는 빈 이름(id)를 지정하므로 @Autowired, @Qualifier를 사용할 때에 비해 XML 설정 파일이 다소 짧아진다는 특징이 있다.

 

XML 설정 파일

<bean id="userRepository1" class="com.user.repository.UserRepository">
<bean id="userRepository2" class="com.user.repository.UserRepository">
<bean id="userRepository3" class="com.user.repository.UserRepository">

<qualifier> 태그가 필요한 @Qualifier과 달리 @Named는 XML 설정 파일에 추가적으로 설정할 것이 없다.

 

자바코드

import javax.inject.Inject;
import javax.inject.Named;

public class UserService {

	@Inject
	@Named("userRepository1")
	private UserRepository userRepository;
	
	public UserService() {
		
	}
}

 

참고

https://www.baeldung.com/spring-annotations-resource-inject-autowire

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

How to list database tables using the "rails console"?

Rails console을 이용해서 데이터베이스 테이블 확인하는 방법

> ActiveRecord::Base.connection.tables

간단하지만 매번 까먹어서 적어놓는다.

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

ruby에서 time zone 관련 요약

사용하지 말아야 하는 것 DON'T USE

* Time.now
* Date.Today
* Date.Today.to_time
* Time.parse("2021-10-21 18:19:20")
* Time.strptime(string, "%Y-%m-%dT%H:%M:%S%z")

사용해도 되는 것 DO USE

* Time.current
* 2.hours.ago
* Time.zone.today
* Date.current
* 1.day.from_now
* Time.zone.parse("2020-10-21 18:06:22")
* TIme.strptime(string, "%Y-%m-%dT%H:%M:%S%z").in_time_zone

 

Time zones in Rails

rails는 ruby와 같은 API를 제공하는데 rails에서 time zones 와 관련된 것을 볼 수 있다.

$ rails time:zones:all

* UTC -12:00 *
International Date Line West

...

* UTC +00:00 *
Casablanca
Dublin
Edinburgh
Lisbon
London
Monrovia
UTC

...

* UTC +09:00 *
Osaka
Sapporo
Seoul
Tokyo
Yakutsk

...

 

Three time zones

rails에서 3가지 time zones가 있다.

- system time

- application time

- database time 

# This is the time on my machine, also commonly described as "system time" (시스템 타임)
> Time.now
=> 2015-07-04 17:53:23 -0400

# Let's set the time zone to be Fiji (피지의 타임존으로 등록해도)
> Time.zone = "Fiji"
=> "Fiji"

# But we still get my system time (여전히 시스템 타임이 출력)
> Time.now
=> 2015-07-04 17:53:37 -0400

# However, if we use `zone` first, we finally get the current time in Fiji (타임존을 등록)
> Time.zone.now
=> Sun, 05 Jul 2015 09:53:42 FJT +12:00

# We can also use `current` to get the same
> Time.current
=> Sun, 05 Jul 2015 09:54:17 FJT +12:00

# Or even translate the system time to application time with `in_time_zone`
> Time.now.in_time_zone
=> Sun, 05 Jul 2015 09:56:57 FJT +12:00

# Let's do the same with Date (we are still in Fiji time, remember?)
# This again is the date on my machine, system date
> Date.today
=> Sat, 04 Jul 2015

# But going through `zone` again, and we are back to application time
> Time.zone.today
=> Sun, 05 Jul 2015

# And gives us the correct tomorrow according to our application's time zone
> Time.zone.tomorrow
=> Mon, 06 Jul 2015

# Going through Rails' helpers, we get the correct tomorrow as well
> 1.day.from_now
=> Mon, 06 Jul 2015 10:00:56 FJT +12:00

 

[출처]

https://thoughtbot.com/blog/its-about-time-zones

 

It's About Time (Zones)

An overview of time zones in Rails.

thoughtbot.com

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

# rails how to generate model array column

 

model을 만들 때 rails g model 명령어를 사용한다.

$ rails g model user Article title:string body:text

 

class CreateArticles < ActiveRecord::Migration[6.0]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :body

      t.timestamps
    end
  end
end

위 명령어를 사용하면 위와 같은 Migration 파일이 생성된다.

title은 string 타입으로, body는 text 타입으로 테이블이 생성된다. 

 

아래 명령어를 통해 들어가보면 

$ rails g model --help
 Available field types:

    Just after the field name you can specify a type like text or boolean.
    It will generate the column with the associated SQL type. 
    For instance:
    
        `rails generate model post title:string body:text`

    will generate a title column with a varchar type and a body column with a text
    type. If no type is specified the string type will be used by default.
    
    You can use the following types:
        integer
        primary_key
        decimal
        float
        boolean
        binary
        string
        text
        date
        time
        datetime

    You can also consider `references` as a kind of type. 
    For instance, if you run:
    
        `rails generate model photo title:string album:references`
        
    It will generate an `album_id` column. You should generate these kinds of fields when
    you will use a `belongs_to` association, for instance. 
    `references` also supports
    polymorphism, you can enable polymorphism like this:
    
        `rails generate model product supplier:references{polymorphic}`
        
    For integer, string, text and binary fields, an integer in curly braces will
    be set as the limit:
    
        `rails generate model user pseudo:string{30}`
        
    For decimal, two integers separated by a comma in curly braces will be used
    for precision and scale:
    
        `rails generate model product 'price:decimal{10,2}'`
        
    You can add a `:uniq` or `:index` suffix for unique or standard indexes
    respectively:
    
        `rails generate model user pseudo:string:uniq`
        `rails generate model user pseudo:string:index`
        
    You can combine any single curly brace option with the index options:
    
        `rails generate model user username:string{30}:uniq`
        `rails generate model product supplier:references{polymorphic}:index`
        
    If you require a `password_digest` string column for use with
    has_secure_password, you can specify `password:digest`:
    
        `rails generate model user password:digest`
        
    If you require a `token` string column for use with
    has_secure_token, you can specify `auth_token:token`:
    
        `rails generate model user auth_token:token`

 

 

 

그런데 배열 타입의 칼럼을 생성할 수 있지 않을까 하는 의문이 들었다 ! 

 

1. migration 파일을 만들어준다.

$ rails g migration Article add_subjects_to_article subjects:text
명령어 설명
- g: generate => g migration 하면 migration 파일을 만들어준다. 예) g controller... , g model ... 등등
- Article: 대신 Table 명
- add_subjects_to_article: 설정하고 싶은 migration 파일 이름
- subjects:text: subjects을 text 타입으로

2. DB가 PostgreSQL인 경우 migration 파일에 다음과 같이 추가해준다.

class AddSubjectsToArticle < ActiveRecord::Migration
  def change
    add_column :articles, :subjects, :text, array: true, default: []
  end
end

여기서 중요한 것은 array: true, default: [] 이다. 이 부분을 직접 작성해준다.

 

2-1. DB가 SQLite3인 경우 app> models> article.rb 에서 

클래스 안에 serialize :subjects, Array 라고 작성한다.

 

3. migrate를 한다.

$ rails db:migrate

 

 

 

 

출처

https://stackoverflow.com/questions/32409820/add-an-array-column-in-rails

 

Add an array column in Rails

How do you declare an array column in Rails? Detail I have the following model rails generate model User address:text but I want a model which can store multiple addresses per user. The following

stackoverflow.com

http://blog.plataformatec.com.br/2014/07/rails-4-and-postgresql-arrays/

 

Rails 4 and PostgreSQL Arrays « Plataformatec Blog

In this post we show how Rails treats PostgreSQL array type, and how to use PL/pgSQL custom functions to do unique validations in PostgreSQL arrays.

blog.plataformatec.com.br

 

추가 (2021.10.23)

코드를 짜다보니 느끼는 거지만 array 칼럼보다는 1:N 연관관계로 설정하는 것이 좋아보인다 !

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

💻 OS: mac m1 os

❓Error: bundle install 또는 rails db:create 사용할 때 발생하는 에러

 

 

macOS (m1)에서 bundle install을 할 때 생기는 에러이다. (while bundle install for mysql2 gem ruby on mac)

둘 중에 한 에러가 뜰 수 있다. (나는 둘 다 번갈아서 에러가 발생했다.)

ld: library not found for -lzstd (zstd 라이브러리를 찾지 못함)

ld: library not found for -lssl (ssl 라이브러리를 찾지 못함)

$ bundle install
(생략)
Installing mysql2 0.5.3 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory:
/Users/jyjeon/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2
/Users/jyjeon/.rbenv/versions/2.6.5/bin/ruby -I
/Users/jyjeon/.rbenv/versions/2.6.5/lib/ruby/2.6.0 -r
./siteconf20210928-15542-ky3uai.rb extconf.rb
--with-ldflags\=-L/opt/homebrew/Cellar/zstd/1.5.0/lib
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
-----
Using mysql_config at /opt/homebrew/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... yes
checking for SSL_MODE_PREFERRED in mysql.h... yes
checking for SSL_MODE_REQUIRED in mysql.h... yes
checking for SSL_MODE_VERIFY_CA in mysql.h... yes
checking for SSL_MODE_VERIFY_IDENTITY in mysql.h... yes
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes
checking for my_bool in mysql.h... no

-----
Don't know how to set rpath on your system, if MySQL libraries are not in path
mysql2 may not load
-----
-----
Setting libpath to /opt/homebrew/Cellar/mysql/8.0.26/lib
-----
(생략)
make "DESTDIR=" clean
(생략)
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2
(생략)
An error occurred while installing mysql2 (0.5.3), and Bundler cannot

continue.

In Gemfile:
  mysql2

 

$ rails db:create
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lzstd
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

이런 에러가 발생한다.

해결책은 bundle clean을 해주면 안 되는 경우가 있다. 그럴 경우 --force를 통해 해 준다.

bundle clean --force
brew uninstall mysql
brew install mysql

mysql이 깔려있을 경우 brew를 사용해서 삭제 후 재설치

 

1) ld: library not found for -lssl (ssl 라이브러리를 찾지 못함)

bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"

2) ld: library not found for -lzstd (zstd 라이브러리를 찾지 못함)

bundle config --local build.mysql2 "--with-ldflags=-L/opt/homebrew/Cellar/zstd/1.5.0/lib"

두 명령어 중 하나를 실행해주면 된다.

되지 않을 때는  sudo명령어를 사용해서 실행함.

gem install mysql2 -v '0.5.3' -- --with-opt-dir=$(brew --prefix openssl) --with-ldflags=-L/opt/homebrew/Cellar/zstd/1.5.0/lib

 

라이브러리 위치를 찾지 못해서 생기는 문제 같다.

 

출처

https://stackoverflow.com/questions/67840691/ld-library-not-found-for-lzstd-while-bundle-install-for-mysql2-gem-ruby-on-mac

 

ld: library not found for -lzstd while bundle install for mysql2 gem Ruby on macOS Big Sur 11.4

while running bundle install An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds

stackoverflow.com

 

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !